我想展平Pandas DataFrame中的JSON列

Sym*_*ony 3 python json normalize pandas

我有一个输入数据框df,如下所示:

id  e
1   {"k1":"v1","k2":"v2"}
2   {"k1":"v3","k2":"v4"}
3   {"k1":"v5","k2":"v6"}
Run Code Online (Sandbox Code Playgroud)

我想“展平”列“ e”,这样我得到的数据帧是:

id  e.k1    e.k2
1   v1  v2
2   v3  v4
3   v5  v6
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我尝试使用json_normalize,但没有成功

pau*_*ult 7

这是一种使用方法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
Run Code Online (Sandbox Code Playgroud)

但是,如果您实际上是a列str而不是a列dict,则首先必须使用来映射它json.loads()

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


use*_*203 5

如果您的列还不是字典,您可以使用map(json.loads)和应用pd.Series

s = df['e'].map(json.loads).apply(pd.Series).add_prefix('e.')
Run Code Online (Sandbox Code Playgroud)

或者如果已经是字典,可以pd.Series直接申请:

s = df['e'].apply(pd.Series).add_prefix('e.')
Run Code Online (Sandbox Code Playgroud)

最后用于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
Run Code Online (Sandbox Code Playgroud)