Pandas扩展记录中的json字段
我遇到了一个有趣的问题,想知道有没有一种简洁、符合Python风格的方法来解决这个问题,而不是逐行遍历数据框。
假设我们有一个数据框,其中有一个字段是用json格式编码的信息:
Name Data
0 Joe '[{"label":"a","value":"1"},{"label":"b","value":"2"}]'
1 Sue '[{"label":"a","value":"3"},{"label":"c","value":"4"}]'
2 Bob '[{"label":"b","value":"4"},{"label":"d","value":"1"}]'
我想把这个json字段展开成多个数据字段,合并不同的列名,最终得到这样的结果:
Name Data a b c d
0 Joe '[{"label":"a"... 1 2
1 Sue '[{"label":"a"... 3 4
2 Bob '[{"label":"b"... 4 1
空白的地方表示缺失值。我知道可以使用read_json从json字段创建数据框,但我还想把这些数据框重新整理成原始数据集的额外列。
所以,有没有优雅的方法可以做到这一点,而不需要逐行遍历数据框呢?任何帮助都将不胜感激。
1 个回答
28
给定
In [96]: df
Out[96]:
Name Data
0 Joe [{"a":"1"},{"b":"2"}]
1 Sue [{"a":"3"},{"c":"4"}]
2 Bob [{"b":"4"},{"d":"1"}]
如果你定义了
import json
def json_to_series(text):
keys, values = zip(*[item for dct in json.loads(text) for item in dct.items()])
return pd.Series(values, index=keys)
那么
In [97]: result = pd.concat([df, df['Data'].apply(json_to_series)], axis=1)
In [98]: result
Out[98]:
Name Data a b c d
0 Joe [{"a":"1"},{"b":"2"}] 1 2 NaN NaN
1 Sue [{"a":"3"},{"c":"4"}] 3 NaN 4 NaN
2 Bob [{"b":"4"},{"d":"1"}] NaN 4 NaN 1
给定
In [22]: df
Out[22]:
Name Data
0 Joe [{"label":"a","value":"1"},{"label":"b","value...
1 Sue [{"label":"a","value":"3"},{"label":"c","value...
2 Bob [{"label":"b","value":"4"},{"label":"d","value...
如果你定义了
def json_to_series(text):
keys, values = zip(*[(dct['label'], dct['value']) for dct in json.loads(text)])
return pd.Series(values, index=keys)
那么
In [20]: result = pd.concat([df, df['Data'].apply(json_to_series)], axis=1)
In [21]: result
Out[21]:
Name Data a b c d
0 Joe [{"label":"a","value":"1"},{"label":"b","value... 1 2 NaN NaN
1 Sue [{"label":"a","value":"3"},{"label":"c","value... 3 NaN 4 NaN
2 Bob [{"label":"b","value":"4"},{"label":"d","value... NaN 4 NaN 1
参考资料: