将python OrderedDict转换为数据帧
我的记录是一个将python OrderedDict转换为数据帧,python,dataframe,ordereddict,Python,Dataframe,Ordereddict,我的记录是一个OrderedDict,如下所示: [<ravenpackapi.models.results.Result at 0x118caadd0>, <ravenpackapi.models.results.Result at 0x118caad90>, <ravenpackapi.models.results.Result at 0x118e1a950>, ..., <ravenpackapi.models.results.Result
OrderedDict
,如下所示:
[<ravenpackapi.models.results.Result at 0x118caadd0>,
<ravenpackapi.models.results.Result at 0x118caad90>,
<ravenpackapi.models.results.Result at 0x118e1a950>,
..., <ravenpackapi.models.results.Result at 0x118da8750>]
my_record=OrderedDict([(u'FIR_ID','111249'),(u'FIR_TYPE','ORG'))
我需要将其加载到数据库中,因此我希望将数据集转换为数据帧,然后转换为CSV文件,以方便数据库加载。但是,当我键入(我的记录)时,我得到:
<class 'pg.mod.results'>
然后,csv.DictWriter()生成包含以下内容的csv:
<Field: TIMESTAMP_UTC>,<Field: RP_STORY_ID>,<Field: RP_ENTITY_ID>,...,<Field: ENTITY_TYPE>,,,,,,,,,,,,,,,
由于缺少值,我尝试:
for r in records: r.data
它成功地给了我所需要的字典。所以我不明白为什么,我不能将任何值写入我的csv。会是这样吗
ravenpackapi.models.fields.ANALYTICS_FIELDS
给我
[<Field: TIMESTAMP_UTC>,
<Field: RP_STORY_ID>,
<Field: RP_ENTITY_ID>,
<Field: ENTITY_TYPE>,...
{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',...,}
给我
[<Field: TIMESTAMP_UTC>,
<Field: RP_STORY_ID>,
<Field: RP_ENTITY_ID>,
<Field: ENTITY_TYPE>,...
{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\u UTC'
与
这起作用了
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)
我相信有比这更好的方法
for r in records: r.data
及
想法?你在开始提问时会说你的对象是一个
有序的ICT
,但事实并非如此。这是一个pg.mod.results
如果它是一个类似dict的对象,并且希望将其存储到csv文件中,则根本不需要将其转换为数据帧,只需使用python中包含的csv.DictWriter
类即可:
records = list(records)
with open('myfile.csv', 'w') as f:
cf = csv.DictWriter(f, records[0].keys())
cf.writeheader()
cf.writerows(records)
编辑:
在下面的评论中,您揭示了这些对象的真正含义-它们不是OrderedDicts,出于某种未知的原因,作者决定返回\uuu str\uuuuuu
对象的方法中的OrderedDicts
,这就是您感到困惑的原因
基于此,结果
对象是一个自定义对象,它在其.data
属性中保存真实数据。然后可以使用该属性进行转换:
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)
我想你的反馈会解决我的问题,但还没有。目前,my_记录是这些类似dict的对象的列表。我尝试了您发送给我的代码,但发现错误:“list”对象没有属性“keys”,这与对象不是“dict”类型的事实一致,因此没有键或值。@Y.Eman我将其更改为使用记录
,这是一个记录列表。它从第一个元素抓取键。在这种情况下你得到了什么?我做了更改,得到了:错误:'Result'对象没有属性'keys'@Y.Eman也许是时候告诉我们这些对象来自哪里了-必须有一种方法来获取要传递给DictWriter
@Y.Eman ough的键列表!糟糕的做法:在\uuuu str\uuuuu
中返回不同对象的表示形式,以混淆使用API的程序员。。。唉,好吧。作者应该提供一个to_dict()
方法或其他东西。
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)