我有一个像

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/

10-12 13:12