基于这个问题,从这个数据帧开始:
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