我有一个从数据库加载数据的dataframe df
。大部分列都是json字符串,有些甚至是json列表。例如:
id name columnA columnB
1 John {"dist": "600", "time": "0:12.10"} [{"pos": "1st", "value": "500"},{"pos": "2nd", "value": "300"},{"pos": "3rd", "value": "200"}, {"pos": "total", "value": "1000"}]
2 Mike {"dist": "600"} [{"pos": "1st", "value": "500"},{"pos": "2nd", "value": "300"},{"pos": "total", "value": "800"}]
...
正如你所看到的,在json字符串中,并不是所有的行都有相同数量的元素。
我需要做的是保持正常列,如id
和name
,并像这样展平json列:
id name columnA.dist columnA.time columnB.pos.1st columnB.pos.2nd columnB.pos.3rd columnB.pos.total
1 John 600 0:12.10 500 300 200 1000
2 Mark 600 NaN 500 300 Nan 800
我试着这样使用json_normalize
:
from pandas.io.json import json_normalize
json_normalize(df)
但是keyerror
似乎有一些问题,正确的做法是什么?
4条答案
按热度按时间scyqe7ek1#
这里有一个再次使用
json_normalize()
的解决方案,通过使用自定义函数来获取json_normalize
函数所理解的正确格式的数据。最后,在公共索引上加入
DFs
,得到:***编辑:-***根据@MartijnPieters的评论,如果你知道数据源是JSON,那么推荐使用
json.loads()
来解码json字符串,这比使用ast.literal_eval()
要快得多。qxgroojn2#
最快的似乎是:
qgelzfjb3#
TL;DR复制粘贴以下函数,使用方法如下:
flatten_nested_json_df(df)
这是我能想到的最通用的函数:
它采用可能在其列中具有嵌套列表和/或dicts的 Dataframe ,并递归地分解/展平那些列。
它使用pandas的
pd.json_normalize
分解字典(创建新列),使用pandas的explode
分解列表(创建新行)。简单用途:
这不是世界上最高效的方法,而且它的副作用是重置 Dataframe 的索引,但它能完成任务。
pprl5pva4#
创建一个自定义函数来展平
columnB
,然后使用pd.concat