我有一个输入数据帧df,如下所示:
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但没有太大的成功
答案 0 :(得分:4)
以下是使用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)
答案 1 :(得分:3)
如果您的专栏不是字典,则可以使用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