Python 如何将pandas数据帧与具有广播功能的numpy阵列相乘

Python 如何将pandas数据帧与具有广播功能的numpy阵列相乘,python,numpy,pandas,array-broadcasting,Python,Numpy,Pandas,Array Broadcasting,我有一个形状为(4,3)的数据框,如下所示: In [1]: import pandas as pd In [2]: import numpy as np In [3]: x = pd.DataFrame(np.random.randn(4, 3), index=np.arange(4)) In [4]: x Out[4]: 0 1 2 0 0.959322 0.099360 1.116337 1 -0.211405 -2.563

我有一个形状为(4,3)的数据框,如下所示:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: x = pd.DataFrame(np.random.randn(4, 3), index=np.arange(4))

In [4]: x
Out[4]: 
          0         1         2
0  0.959322  0.099360  1.116337
1 -0.211405 -2.563658 -0.561851
2  0.616312 -1.643927 -0.483673
3  0.235971  0.023823  1.146727
我想将数据帧的每一列乘以一个形状为(4,)的numpy数组:

在numpy,以下广播技巧有效:

In [12]: x.values * y[:, None]
Out[12]: 
array([[-0.32737369, -0.03390716, -0.38095588],
       [-0.25700028, -3.11658448, -0.68303043],
       [-0.07956223,  0.21222123,  0.06243928],
       [ 0.15273815,  0.01541983,  0.74224861]])
但是,在熊猫数据帧的情况下,它不起作用,我得到以下错误:

In [13]: x * y[:, None]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-13-21d033742c49> in <module>()
----> 1 x * y[:, None]
...
ValueError: Shape of passed values is (1, 4), indices imply (3, 4)
[13]中的
x*y[:,无]
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
---->1 x*y[:,无]
...
ValueError:传递值的形状为(1,4),索引暗示(3,4)
有什么建议吗


谢谢

我认为最好使用df.apply()方法。就你而言:

x.apply(lambda x: x * y)

我找到了另一种在pandas数据帧和numpy数组之间进行乘法的方法

In [14]: x.multiply(y, axis=0)
Out[14]: 
          0         1         2
0  0.195346  0.443061  1.219465
1  0.194664  0.242829  0.180010
2  0.803349  0.091412  0.098843
3  0.365711 -0.388115  0.018941

你的代码在我这边很好用。也许版本不同
pd.\uu版本:0.16.1'np.\uu版本:1.9.2'
如果我写
x.values*y[:,None]
而不是
x*y[:,None]
,这是你在[13]中的行
,这对我来说是有效的。我正在使用以下版本:pd.\uu版本:0.16.2',np.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。此操作(x*y[:,None])仍然不起作用。我怀疑这是由pandas或numpy版本引起的问题。谢谢,我尝试了这个:x.apply(lambda x:x*y),它对我有效。是的,这完全正确。抱歉——我在最初的回答中使用了传统的'df',因为我认为使用'x'可能会导致内部和外部作用域中变量之间的混淆。很好。另外,df.multiply()看起来与df.mull()等价
In [14]: x.multiply(y, axis=0)
Out[14]: 
          0         1         2
0  0.195346  0.443061  1.219465
1  0.194664  0.242829  0.180010
2  0.803349  0.091412  0.098843
3  0.365711 -0.388115  0.018941