在Pandas数据帧中,我想要展平JSON列。

8

I have an input dataframe df which is as follows:

id  e
1   {"k1":"v1","k2":"v2"}
2   {"k1":"v3","k2":"v4"}
3   {"k1":"v5","k2":"v6"}

我想“展平”列 'e',以便我的结果数据框如下:
id  e.k1    e.k2
1   v1  v2
2   v3  v4
3   v5  v6

我该怎么做?我尝试使用json_normalize,但没有太大的成功。

2个回答

16

这里是使用 pandas.io.json.json_normalize() 的方法:

from pandas.io.json import json_normalize
df = df.join(json_normalize(df["e"].tolist()).add_prefix("e.")).drop(["e"], axis=1)
print(df)
#  e.k1 e.k2
#0   v1   v2
#1   v3   v4
#2   v5   v6

然而,如果您的列实际上是一个str而不是dict,那么您需要先使用json.loads()进行映射:

import json
df = df.join(json_normalize(df['e'].map(json.loads).tolist()).add_prefix('e.'))\
    .drop(['e'], axis=1)

在执行 df.join 之前,您可能需要先执行 df = df.reset_index(),以确保行匹配正确。 - dominik
@pault 如果某些行的json列为空,您会如何采用此方法。您的解决方案对于所有行都具有有效json的情况适用,但是如果我有任何带有空列的行,则会出现错误:AttributeError:'float'对象没有属性'items' - Snapula

5

如果你的列不是字典类型,你可以使用 map(json.loads) 并应用 pd.Series:

s = df['e'].map(json.loads).apply(pd.Series).add_prefix('e.')

如果已经是字典格式,可以直接使用 pd.Series 函数:

s = df['e'].apply(pd.Series).add_prefix('e.')

最后使用pd.concat来连接其他列:
>>> pd.concat([df.drop(['e'], axis=1), s], axis=1).set_index('id')    
id e.k1 e.k2
1    v1   v2
2    v3   v4
3    v5   v6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接