将DataFrame乘以不同形状的DataFrame(或系列)

时间:2018-10-12 02:04:17

标签: python pandas numpy numpy-broadcasting

我有这样的DataFrame:

1  2  1  3  1  4
2  4  5  1  1  4
1  3  5  3  1  4
1  3  1  3  1  4

另一个这样的

1  1  0  0  0  0

我想乘以它们得到的结果

1  2  0  0  0  0
2  4  0  0  0  0
1  3  0  0  0  0
1  3  0  0  0  0

因此,正在发生的事情是第二个df中每个具有1的列将每个值乘以一个,而每个具有0的列会将第一个数据帧中的所有列乘以0。

2 个答案:

答案 0 :(得分:4)

使用底层数组可能是最简单的,让numpy来传播魔术:

>>> df1.values * df2.values
array([[1, 2, 0, 0, 0, 0],
       [2, 4, 0, 0, 0, 0],
       [1, 3, 0, 0, 0, 0],
       [1, 3, 0, 0, 0, 0]])

您可以使用以下方法将其放回与df1相同列的数据框中:

>>> pd.DataFrame(df1.values * df2.values, columns=df1.columns)
   0  1  2  3  4  5
0  1  2  0  0  0  0
1  2  4  0  0  0  0
2  1  3  0  0  0  0
3  1  3  0  0  0  0

或者,如果您不介意覆盖df1

>>> df1[:] = df1.values * df2.values
>>> df1
   0  1  2  3  4  5
0  1  2  0  0  0  0
1  2  4  0  0  0  0
2  1  3  0  0  0  0
3  1  3  0  0  0  0

或者,如果需要,您可以与np.broadcast_to一起玩乐:

>>> df1*np.broadcast_to(df2,df1.shape)
   0  1  2  3  4  5
0  1  2  0  0  0  0
1  2  4  0  0  0  0
2  1  3  0  0  0  0
3  1  3  0  0  0  0

答案 1 :(得分:1)

使用pandas mul

df1.mul(df2.T[0])
Out[22]: 
   1  2  3  4  5  6
0  1  2  0  0  0  0
1  2  4  0  0  0  0
2  1  3  0  0  0  0
3  1  3  0  0  0  0