如何根据dict键从嵌套dict创建多个新的数据帧列



基于这个问题,从这个数据帧开始:

import pandas as pd
data = {'key':[111, 112, 113, 114],'other_data':[1, 2, 5, 7]}
df = pd.DataFrame(data)

df

key  other_data
0  111           1
1  112           2
2  113           5
3  114           7

并且我想要基于字典键和数据帧中的一个指定列来映射多个新列。

d = {
"111": {
"en": 4,
"es": 2
},
"112": {
"en": 1,
"es": 8
},
"113": {
"en": 0,
"es": 11
},
"114": {
"en": 2,
"es": 3
}
}

预期输出数据帧为

key,other_data,en,es
111,1,4,2
112,2,1,8
113,5,0,11
114,7,2,3

数据帧很大,所以如果可能的话,我更喜欢在一个循环或操作中完成。

我尝试了map()apply()的各种组合,但都无法使用。

从字典创建DataFrame,通过DataFrame.join将索引转置并转换为匹配key列的整数(需要相同类型(:

df = df.join(pd.DataFrame(d).T.rename(index=int), on='key')
print (df)
key  other_data  en  es
0  111           1   4   2
1  112           2   1   8
2  113           5   0  11
3  114           7   2   3

感谢@ThePyGuy建议使用DataFrame.from_dict:

df = df.join(pd.DataFrame.from_dict(d, orient='index').rename(index=int), on='key')

我建议您计划合并的列使用相同的数据类型,因为这在panda中很重要,如果这不是问题,并且您计划手动进行,那么您可以尝试以下操作:

import pandas as pd
df1 = pd.DataFrame.from_dict(d, orient="index")
df1.reset_index(inplace=True)
df = df.merge(df1, left_on="key", right_on="index")
df.drop(columns="index", inplace=True)

但是,如果您不希望更改列,这是一种很麻烦的方法。使用pandas concat。

df = pd.concat((df, df1), axis=1).drop(columns="index")

两种情况下的输出:

key  other_data  en  es
0  111           1   4   2
1  112           2   1   8
2  113           5   0  11
3  114           7   2   3

最新更新