首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将python OrderedDict转换为dataframe

将python OrderedDict转换为dataframe
EN

Stack Overflow用户
提问于 2018-06-30 02:09:37
回答 1查看 1.6K关注 0票数 -1

我的记录,一个OrderedDict,看起来像这样:

my_record = OrderedDict([ (u'FIR_ID', '111249'), (u'FIR_TYPE', 'ORG')])

我需要将其加载到数据库中,因此我希望将数据集转换为dataframe,然后再转换为CSV文件,以便于加载数据库。但是,当我使用type(my_record)时,我会得到:

代码语言:javascript
复制
<class 'pg.mod.results'>

这意味着它是一个类对象。如果它是collections.OrderedDict类型的,我可以只做一个DataFrame(my_record)。我使用的是Python 2.x。如何将此OrderedDict转换为DataFrame

编辑

多亏了nosklo的代码,错误消失了;列标题存在,但是值丢失了。我提取了10条记录,如下所示:

代码语言:javascript
复制
[<ravenpackapi.models.results.Result at 0x118caadd0>,
 <ravenpackapi.models.results.Result at 0x118caad90>,
 <ravenpackapi.models.results.Result at 0x118e1a950>,
...,  <ravenpackapi.models.results.Result at 0x118da8750>]

然后,csv.DictWriter()生成包含以下内容的csv:

代码语言:javascript
复制
<Field: TIMESTAMP_UTC>,<Field: RP_STORY_ID>,<Field: RP_ENTITY_ID>,...,<Field: ENTITY_TYPE>,,,,,,,,,,,,,,,

它看起来像是钥匙的完整列表。并且在文件的末尾有许多行的',,,‘表示缺少值。

更新

我当前的代码是:

代码语言:javascript
复制
records = list(records)
with open('/Users/.../.../RP_test_5.txt', 'w') as f:
    cf = csv.DictWriter(f, 
        ravenpackapi.models.fields.ANALYTICS_FIELDS,
        extrasaction='ignore') 
    cf.writeheader()
    cf.writerows(r.data for r in records)

由于缺少这些值,我尝试了:

代码语言:javascript
复制
for r in records: r.data

它成功地给了我所需要的字典。所以我不明白为什么,我不能将任何值写入我的csv。会不会是这样?

代码语言:javascript
复制
ravenpackapi.models.fields.ANALYTICS_FIELDS

给了我

代码语言:javascript
复制
[<Field: TIMESTAMP_UTC>,
 <Field: RP_STORY_ID>,
 <Field: RP_ENTITY_ID>,
 <Field: ENTITY_TYPE>,...

然而,r.data来自

代码语言:javascript
复制
for r in records: r.data

给了我

代码语言:javascript
复制
 {u'RP_ENTITY_ID': u'91C82E',
 u'RP_POSITION_ID': None,
 u'RP_SOURCE_ID': u'C98333',
 u'RP_STORY_EVENT_COUNT': 17,
 u'RP_STORY_EVENT_INDEX': 5,
 u'RP_STORY_ID': u'54F16F66850FB15F838629FD0C41F1CD',
 u'SOURCE_NAME': u'Ticker Report',
 u'SUB_TYPE': None,
 u'TIMESTAMP_UTC': u'2018-06-30 00:03:10.457',...,}

哪些键的顺序不同,和/或键的格式不同?

u'TIMESTAMP_UTC'<Field: TIMESTAMP_UTC>

This worked

代码语言:javascript
复制
records = list(records)

for r in records: r.data

with open('/Users/.../RP_test_6.txt', 'w') as f:
    cf = csv.DictWriter(f, 
        r.data.keys(),
        extrasaction='ignore') 
    cf.writeheader()
    cf.writerows(r.data for r in records)

我相信有比这更好的方法

代码语言:javascript
复制
for r in records: r.data

代码语言:javascript
复制
r.data.keys()

想法?

EN

回答 1

Stack Overflow用户

发布于 2018-06-30 02:13:52

您可以这样开始您的问题:您的对象是一个OrderedDict,但它不是。这是一个pg.mod.results

如果它是一个类dict的对象,并且你想将它存储到csv文件中,你根本不需要将它转换为DataFrame,你可以只使用python中包含的csv.DictWriter类:

代码语言:javascript
复制
records = list(records)

with open('myfile.csv', 'w') as f:
    cf = csv.DictWriter(f, records[0].keys()) 
    cf.writeheader()
    cf.writerows(records)

编辑:

在下面的评论中,你揭示了这些对象的真正含义--它们不是OrderedDicts,出于某种未知的原因,作者决定在Result对象的__str__方法中返回OrderedDict的表示,这就是为什么你会感到困惑。

基于此https://github.com/RavenPack/python-api/blob/e3c99f5eaab7819a2087565ce0859bfb956a45cc/ravenpackapi/models/results.py#L33Result对象是一个在其.data属性中保存实际数据的自定义对象。然后,您可以使用该属性进行转换:

代码语言:javascript
复制
with open('myfile.csv', 'w') as f:
    cf = csv.DictWriter(f, 
        ravenpackapi.models.fields.ANALYTICS_FIELDS,
        extrasaction='ignore') 
    cf.writeheader()
    cf.writerows(r.data for r in records)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51107284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档