我正在尋找有關如何將 python 多級嵌套字典(來自 JSON)干凈地轉換為資料框布爾表的任何建議。
規則:
- 僅記錄 True。如果為空,則為 False。
- 該串列的長度可能為 N
- 組的長度可能為 N
- 布林值可能是 N 種型別
示例輸入:
{1:{'group_a':{'bool_a':True,
'bool_b':True,
'bool_n':True},
'group_n':{'bool_b':True,
'bool_n':True}
},
2:{'group_a':{'bool_a':True,
'bool_b':True,
'bool_n':True},
'group_n':{'bool_b':True,
'bool_n':True}
},
'n':{'group_a':{'bool_a':True,
'bool_c':True},
'group_n':{'bool_b':True}
},
}
期望的輸出:
Ga_Ba, Ga_Bb, Ga_Bc, Ga_Bn, Gn_Ba, Gn_Bb, ... Gn_Bn....
1 True True False True False True True
2 True True False True False True True
n True False True False False False False
...
想法?速度和簡潔性的加分。我有一個解決方案,但我正在尋找比我現在擁有的 for 回圈混亂更優雅的東西。替代資料結構也可能受到歡迎。
uj5u.com熱心網友回復:
高飛方法#1
s = pd.DataFrame.from_dict(data, orient='index').stack()
pd.json_normalize(s).set_index(s.index) \
.stack().unstack([1, 2], fill_value=False) \
.sort_index(axis=1)
group_a group_n
bool_a bool_b bool_c bool_n bool_b bool_n
1 True True False True True True
2 True True False True True True
3 True False True False True False
直接來自理解
pd.DataFrame.from_dict({
k0: {
f'G{k1.split("_")[1]}_B{k2.split("_")[1]}': val
for k1, d1 in d0.items()
for k2, val in d1.items()
}
for k0, d0 in data.items()
}, orient='index').fillna(False)
Ga_Ba Ga_Bb Ga_Bn Gn_Bb Gn_Bn Ga_Bc
1 True True True True True False
2 True True True True True False
3 True False False True False True
uj5u.com熱心網友回復:
您可以使用字典理解和concat:
import pandas as pd
values = {
"1": {
"group_a": {"bool_a": True, "bool_b": True, "bool_n": True},
"group_n": {"bool_b": True, "bool_n": True},
},
"2": {
"group_a": {"bool_a": True, "bool_b": True, "bool_n": True},
"group_n": {"bool_b": True, "bool_n": True},
},
"n": {"group_a": {"bool_a": True, "bool_c": True}, "group_n": {"bool_b": True}},
}
stacked_values = {k: pd.DataFrame(v).stack() for k, v in values.items()}
df = (
pd.concat(stacked_values, axis=1)
.T.fillna(False)
.swaplevel(axis=1) # optional
.sort_index(axis=1)
)
輸出:
group_a group_n
bool_a bool_b bool_c bool_n bool_b bool_n
1 True True False True True True
2 True True False True True True
n True False True False True False
uj5u.com熱心網友回復:
嘗試使用資料框 pivot_table
dct={1:{'group_a':{'bool_a':True,
'bool_b':True,
'bool_n':True},
'group_n':{'bool_b':True,
'bool_n':True}
},
2:{'group_a':{'bool_a':True,
'bool_b':True,
'bool_n':True},
'group_n':{'bool_b':True,
'bool_n':True}
},
'n':{'group_a':{'bool_a':True,
'bool_c':True},
'group_n':{'bool_b':True}
},
}
df=pd.DataFrame.from_dict(dct, orient='index')
df=df.stack()
lst=[]
for k,vals in df.items():
for index,item in vals.items():
lst.append((k[0],k[1],index,item))
df=pd.DataFrame(lst,columns=['col1','col2','col3','col4'])
#print(df)
fp=df.pivot_table(index='col1',columns=['col2','col3'],values='col4', aggfunc=np.any).fillna(False)
print(fp)
輸出:
col2 group_a group_n
col3 bool_a bool_b bool_c bool_n bool_b bool_n
col1
1 True True False True True True
2 True True False True True True
n True False True False True False
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/456041.html
標籤:Python json python-3.x 熊猫 数据框
