我有一個這樣的資料框:
df
name A B C D
0 name1 11 12 13 14
1 name2 21 22 23 24
還有這本字典:
d = {'name1': {'1': {'0': 9, '1': 0, '2': 0},
'2': {'0': 14, '1': 8, '2': 10},
'3': {'0': 0, '1': 5, '2': 0}},
'name2': {'1': {'0': 6, '1': 0, '2': 7},
'2': {'0': 8, '1': 9, '2': 8},
'3': {'0': 0, '1': 5, '2': 10}},
'name3': {'1': {'0': 3, '1': 97, '2': 0},
'2': {'0': 36, '1': 50, '2': 1},
'3': {'0': 11, '1': 78, '2': 0}}}
我想得到這樣的結果:
name A B C D 1 2 3
0 name1 11 12 13 14 9 14 0
0 8 5
0 10 0
1 name2 21 22 23 24 6 8 0
0 9 5
7 8 10
我試圖自己解決它。但我的解決方案相當粗糙。您能提出更好的解決方案嗎?這是我所做的:
df_d = pd.DataFrame.from_dict({(i,j): d[i][j]
for i in d.keys()
for j in d[i].keys()},
orient='index')
df_d.index.names = ['name','rating']
df_d= df_d.stack().unstack(level='rating')
df_d.reset_index()
df_result = pd.merge(df, df_d, how='left', on='prod_name')
df_result = df_result.reset_index(drop=True).set_index(['name','A', 'B', 'C', 'D'])
uj5u.com熱心網友回復:
這是獲取 MultiIndex 資料幀的建議:
df_d= pd.concat({k: pd.DataFrame(v) for k, v in d.items()}, axis=0, names = ['name'])
out1= df.merge(df_d, on = 'name').set_index(['name', 'A','B','C','D'])
print(out1)
1 2 3
name A B C D
name1 11 12 13 14 9 14 0
14 0 8 5
14 0 10 0
name2 21 22 23 24 6 8 0
24 0 9 5
24 7 8 10
或者要獲取單個索引資料框,您可以替換pandas.DataFrame.set_index為:
import numpy as np
out2.loc[out2.duplicated('name'), ['name', 'A', 'B', 'C']] = np.NaN
print(out2)
name A B C D 1 2 3
0 name1 11.0 12.0 13.0 14 9 14 0
1 NaN NaN NaN NaN 14 0 8 5
2 NaN NaN NaN NaN 14 0 10 0
3 name2 21.0 22.0 23.0 24 6 8 0
4 NaN NaN NaN NaN 24 0 9 5
5 NaN NaN NaN NaN 24 7 8 10
uj5u.com熱心網友回復:
也許不是最干凈的,但命令更少:
df = df.merge(
pd.DataFrame(d).T.reset_index().rename(columns={"index": "name"}), on="name"
).set_index(["name", "A", "B", "C", "D"])
df = df.apply(lambda x: [d.values() for d in x]).explode(df.columns.to_list())
print(df)
印刷:
1 2 3
name A B C D
name1 11 12 13 14 9 14 0
14 0 8 5
14 0 10 0
name2 21 22 23 24 6 8 0
24 0 9 5
24 7 8 10
uj5u.com熱心網友回復:
我認為您的方法的一個問題是您將 A、B、C 和 D 列設定為索引,這使得結果表不那么“干凈”或可讀。
除了您要洗掉d值的鍵/索引之外,這是有意的嗎?我建議讓他們在多索引上執行合并:
df.set_index("name", inplace=True)
df.index = pd.MultiIndex.from_tuples([(x, "0") for x in df.index], names=["name", "id"])
df2 = pd.DataFrame()
for k, v in d.items():
df_tmp = pd.DataFrame(v)
df_tmp.index = pd.MultiIndex.from_product([[k], df_tmp.index], names=["name", "id"])
df2 = pd.concat([df2, df_tmp])
print(pd.merge(df, df2, on=["name", "id"], how="outer").sort_index())
輸出:
A B C D 1 2 3
name id
name1 0 11.0 12.0 13.0 14.0 9 14 0
1 NaN NaN NaN NaN 0 8 5
2 NaN NaN NaN NaN 0 10 0
name2 0 21.0 22.0 23.0 24.0 6 8 0
1 NaN NaN NaN NaN 0 9 5
2 NaN NaN NaN NaN 7 8 10
name3 0 NaN NaN NaN NaN 3 36 11
1 NaN NaN NaN NaN 97 50 78
2 NaN NaN NaN NaN 0 1 0
編輯:修復了作為索引的鍵
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528191.html
標籤:Python熊猫字典合并
上一篇:組裝由字典屬性連接的單獨句子
