我有一个像
df1 = pd.DataFrame({'name':['al', 'ben', 'cary'], 'bin':[1.0, 1.0, 3.0], 'score':[40, 75, 15]})
bin name score
0 1 al 40
1 1 ben 75
2 3 cary 15
和一个像
df2 = pd.DataFrame({'bin':[1.0, 2.0, 3.0, 4.0, 5.0], 'x':[1, 1, 0, 0, 0],
'y':[0, 0, 1, 1, 0], 'z':[0, 0, 0, 1, 0]})
bin x y z
0 1 1 0 0
1 2 1 0 0
2 3 0 1 0
3 4 0 1 1
4 5 0 0 0
我想做的是用“ x”,“ y”和“ z”列扩展df1,仅在bin匹配且相应的“ x”,“ y”,“ z”值为1,而不是0。
我已经到了
df3 = pd.merge(df1,df2,how ='left',on = ['bin'])
bin name score x y z
0 1 al 40 1 0 0
1 1 ben 75 1 0 0
2 3 cary 15 0 1 0
但是我看不到一种将分数值放入正确的“ x”,“ y”等列的绝妙方法(我的现实生活中的问题有一百多个这样的列,因此df3 ['x'] = df3 [' score'] * df3 ['x']可能会比较慢)。
最佳答案
您可以只获取要乘以分数的列的列表,然后使用apply
函数:
cols = [each for each in df2.columns if each not in ('name', 'bin')]
df3 = pd.merge(df1, df2, how='left', on=['bin'])
df3[cols] = df3.apply(lambda x: x['score'] * x[cols], axis=1)
关于python - Pandas 数据框合并和元素范围内的乘法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25066316/