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

EGM*_*686 4 python numpy pandas 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
Run Code Online (Sandbox Code Playgroud)

这样的另一个

1  1  0  0  0  0
Run Code Online (Sandbox Code Playgroud)

我想乘以他们得到

1  2  0  0  0  0
2  4  0  0  0  0
1  3  0  0  0  0
1  3  0  0  0  0
Run Code Online (Sandbox Code Playgroud)

因此,正在发生的情况是,第二个df中的每个列都将每个值乘以一个,而每个列中的值为零则将第一个数据帧中的所有列都乘以0。

sac*_*cuL 5

使用底层数组可能是最容易的,并且让它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]])
Run Code Online (Sandbox Code Playgroud)

您可以将其放回与使用相同列的数据框中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
Run Code Online (Sandbox Code Playgroud)

或者,如果您不介意覆盖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
Run Code Online (Sandbox Code Playgroud)

另外,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
Run Code Online (Sandbox Code Playgroud)