【发布时间】: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