隐蔽python OrderedDict到数据框

时间:2018-06-29 18:09:37

标签: python dataframe ordereddict

我的记录OrderedDict如下:

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

我需要将此加载到数据库,因此我想将数据集转换为数据框,然后转换为CSV文件,以方便db加载。但是,当我做type(my_record)时,我得到:

<class 'pg.mod.results'>

这意味着它是一个类对象。如果它是collections.OrderedDict类型,我可以做一个DataFrame(my_record)。我正在使用Python2.x。我可以将此OrderedDict转换为DataFrame吗?

修改

感谢nosklo的代码,错误消失了;列标题在那里,但缺少值。我提取了10条看起来像这样的记录:

[<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:

<Field: TIMESTAMP_UTC>,<Field: RP_STORY_ID>,<Field: RP_ENTITY_ID>,...,<Field: ENTITY_TYPE>,,,,,,,,,,,,,,,

看起来像完整的键列表。文件末尾有很多行“ 、、、”,表示缺少值。

更新

我当前的代码是这样:

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)

由于缺少值,我尝试了:

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>,...

r.data
for r in records: r.data

给我

 {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>

这有效

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

r.data.keys()

想法?

1 个答案:

答案 0 :(得分:1)

通过说对象是OrderedDict来开始提问,但不是。这是pg.mod.results

如果它是类似dict的对象,并且要将其存储到csv文件中,则根本不需要将其转换为DataFrame,只需使用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,并且由于某些未知原因,作者决定在{{的OrderedDict方法中返回__str__的表示形式1}}对象,这就是为什么让您感到困惑的原因。

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

.data