【问题标题】:How do I parse list of dict of dict of ... dict to dataframe?如何将 dict of ... dict 的 dict 列表解析为数据帧?
【发布时间】:2019-09-09 13:06:40
【问题描述】:

我有一个字典列表...基本上,它只是 JSON 的一大块。这里看起来像列表中的一个字典:

{'id': 391257, 'from_id': -1, 'owner_id': -1, 'date': 1554998414, 'marked_as_ads': 0, 'post_type': 'post', 'text': 'Весна — время обновлений. Очищаем балконы от старых лыж и API от устаревших версий: уже скоро запросы к API c версией ниже 5.0 перестанут поддерживаться.\n\nОжидаемая дата изменений: 15 мая 2019 года. \n\nПодробности в Roadmap: https://vk.com/dev/version_update_2.0', 'post_source': {'type': 'vk'}, 'comments': {'count': 91, 'can_post': 1, 'groups_can_post': True}, 'likes': {'count': 182, 'user_likes': 0, 'can_like': 1, 'can_publish': 1}, 'reposts': {'count': 10, 'user_reposted': 0}, 'views': {'count': 63997}, 'is_favorite': False}

我想将每个字典转储到框架中。如果我只是这样做

data = pandas.DataFrame(list_of_dicts)

我得到一个框架,其中只有两列:第一列包含键,另一列包含数据,如下所示:

我尝试循环执行:

for i in list_of_dicts:
    tmp = pandas.DataFrame().from_dict(i)
    data = pandas.concat([data, tmp])
    print(i)

但我面临 ValueError:

Traceback (most recent call last):
  File "/home/keddad/PycharmProjects/vk_group_parse/Data Grabber.py", line 68, in <module>
    main()
  File "/home/keddad/PycharmProjects/vk_group_parse/Data Grabber.py", line 61, in main
    tmp = pandas.DataFrame().from_dict(i)
  File "/home/keddad/anaconda3/envs/vk_group_parse/lib/python3.7/site-packages/pandas/core/frame.py", line 1138, in from_dict
    return cls(data, index=index, columns=columns, dtype=dtype)
  File "/home/keddad/anaconda3/envs/vk_group_parse/lib/python3.7/site-packages/pandas/core/frame.py", line 392, in __init__
    mgr = init_dict(data, index, columns, dtype=dtype)
  File "/home/keddad/anaconda3/envs/vk_group_parse/lib/python3.7/site-packages/pandas/core/internals/construction.py", line 212, in init_dict
    return arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype)
  File "/home/keddad/anaconda3/envs/vk_group_parse/lib/python3.7/site-packages/pandas/core/internals/construction.py", line 51, in arrays_to_mgr
    index = extract_index(arrays)
  File "/home/keddad/anaconda3/envs/vk_group_parse/lib/python3.7/site-packages/pandas/core/internals/construction.py", line 320, in extract_index
    raise ValueError('Mixing dicts with non-Series may lead to '
ValueError: Mixing dicts with non-Series may lead to ambiguous ordering.

在此之后,我如何获得包含一篇文章的数据框(列表中的一个字典是一篇文章)并将其中的所有数据作为列?

【问题讨论】:

  • 不是骗子,但您可以查看 this answer 将字典列表转换为 DataFrame。对于嵌套的字典,请使用json_normalize
  • @cs95,谢谢,它是如何更好的。但是“dicts in dicts”仍然写为附件。例如,我仍然在“附件”列中有一段 json。我也在寻找一种在这些 jsons 普通列中创建键的方法。现在我可以遍历列,解析它并与框架合并,但是这个解决方案不能被命名为优雅。我会尝试寻找更优雅的解决方案:D
  • 正如@cs95 所说 - 你不只是想要df = pd.io.json.json_normalize(list_of_dicts) 吗?它将展平 json,因此每个 key:value 成为一列

标签: python-3.x pandas dictionary


【解决方案1】:

我无法准确计算出df,但我认为您只需要做一个reset_index 以及当前(似乎)的所有数据:

df.reset_index(inplace=True)

如果您希望将 keys 作为列,还有另一件事:

df = pd.Dataframe.from_dict(orient='columns')  
# or try `index` in columns if you don't get desired results

在for循环中:

l = []
for i in dict.keys:
    l.append(pd.DataFrame.from_dict(dict[i], orient='columns'))
df = pd.concat(l)

【讨论】:

    【解决方案2】:

    不太清楚你要做什么,但你的意思是这样的吗?

    您只需打印数据框即可查看数据内部。或者您可以通过以下代码打印每一个。

    data = pandas.DataFrame(list_of_dicts)
    print(data)
    
    for i in data.loc[:, data.columns]:
        print(data[i])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-06
      • 2021-06-02
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 2022-06-17
      相关资源
      最近更新 更多