【问题标题】:Covert python OrderedDict to dataframe将 python OrderedDict 转换为数据框
【发布时间】:2018-12-08 23:25:56
【问题描述】:

我的记录,OrderedDict,如下所示:

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

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

<class 'pg.mod.results'>

这意味着它是一个类对象。如果它是collections.OrderedDict 类型,我可以做一个DataFrame(my_record)。我正在使用 Python 2.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'&lt;Field: TIMESTAMP_UTC&gt;

成功了

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()

想法?

【问题讨论】:

    标签: python dataframe ordereddict


    【解决方案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)
    

    编辑:

    在下面的 cmets 中,您揭示了这些对象的真正含义 - 它们不是 OrderedDicts 并且由于某些未知原因,作者决定在 __str__ 对象的 __str__ 方法中返回 OrderedDict 的表示,即这就是你感到困惑的原因。

    基于此https://github.com/RavenPack/python-api/blob/e3c99f5eaab7819a2087565ce0859bfb956a45cc/ravenpackapi/models/results.py#L33Result 对象是一个自定义对象,它在其.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_record 是这些类似字典的对象的列表。我尝试了您发送给我的代码,但出现错误:“list”对象没有属性“keys”,这与对象不是“dict”类型因此没有键或值的事实一致。
    • @Y.Eman 我将其更改为使用records,这是一个记录列表。它从第一个元素中获取键。在这种情况下你会得到什么?
    • 我进行了更改并得到:错误:'Result' object has no attribute 'keys'
    • @Y.Eman 也许是时候告诉我们这些对象来自哪里了——必须有一种方法可以获取传递给DictWriter的键列表
    • @Y.Eman 啊!糟糕的做法:在__str__ 中返回一个不同对象的表示来迷惑使用API​​ 的程序员... sigh 哦,好吧。作者应该提供to_dict()方法什么的。
    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 2018-05-06
    • 2021-12-01
    • 2019-01-19
    • 2022-01-09
    • 1970-01-01
    • 2013-09-21
    相关资源
    最近更新 更多