在 Pandas 中展开多列
Explode multiple columns in Pandas
我研究了这个问题,发现 Pandas' explode 函数在多个列上不起作用,但是,我在 Whosebug 上看到了一些提交的问题,但是,其中 none为我工作。
数据集:
j = {
"_id" : "5c45",
"user" : 5,
"ids" : [
"1019",
"1021",
"1162"
],
"roles" : ["2d7f"]
}
当前脚本:
root = json_normalize(j)
x = (root.applymap(type) == list).all()
y = x.index[x].tolist()
root = root.apply(lambda x: [str(v).split(',') for v in x]).apply(pd.Series.explode)
print(root)
我试过这个解决方案 ,但我得到一个值错误:
ValueError: cannot reindex from a duplicate axis
预期结果:
_id,user,ids,roles
5c45,5,1019,2d7f
5c45,5,1021,2d7f
5c45,5,1162,2d7f
是否有简单而有效的解决方法?
尝试 record_path
和 meta
选项:
pd.json_normalize(j, record_path=['ids'], meta=['_id','user','roles'])
输出:
0 _id user roles
0 1019 5c45 5 2d7f
1 1021 5c45 5 2d7f
2 1162 5c45 5 2d7f
对于稍微动态的解决方案,请尝试展平单例:
pd.DataFrame({k:v[0] if isinstance(v, list) and len(v) == 1 else v
for k,v in j.items()
})
我研究了这个问题,发现 Pandas' explode 函数在多个列上不起作用,但是,我在 Whosebug 上看到了一些提交的问题,但是,其中 none为我工作。
数据集:
j = {
"_id" : "5c45",
"user" : 5,
"ids" : [
"1019",
"1021",
"1162"
],
"roles" : ["2d7f"]
}
当前脚本:
root = json_normalize(j)
x = (root.applymap(type) == list).all()
y = x.index[x].tolist()
root = root.apply(lambda x: [str(v).split(',') for v in x]).apply(pd.Series.explode)
print(root)
我试过这个解决方案
ValueError: cannot reindex from a duplicate axis
预期结果:
_id,user,ids,roles
5c45,5,1019,2d7f
5c45,5,1021,2d7f
5c45,5,1162,2d7f
是否有简单而有效的解决方法?
尝试 record_path
和 meta
选项:
pd.json_normalize(j, record_path=['ids'], meta=['_id','user','roles'])
输出:
0 _id user roles
0 1019 5c45 5 2d7f
1 1021 5c45 5 2d7f
2 1162 5c45 5 2d7f
对于稍微动态的解决方案,请尝试展平单例:
pd.DataFrame({k:v[0] if isinstance(v, list) and len(v) == 1 else v
for k,v in j.items()
})