【问题标题】:how to multiply pandas dataframe with numpy array with broadcasting如何将pandas数据帧与numpy数组相乘并进行广播
【发布时间】:2015-08-12 16:07:31
【问题描述】:

我有一个形状为 (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 数组相乘:

In [9]: y = np.random.randn(4)

In [10]: y
Out[10]: array([-0.34125522,  1.21567883, -0.12909408,  0.64727577])

在 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]])

但是,它在 pandas 数据帧的情况下不起作用,我收到以下错误:

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)

有什么建议吗?

谢谢!

【问题讨论】:

  • 您的代码对我来说运行良好。也许是版本差异? pd.__version__: '0.16.1' np.__version__: '1.9.2'
  • 如果我写 x.values * y[:, None] 而不是 x * y[:, None] 这对我有用,这就是你的行中的 In [13]
  • 我正在使用以下版本:pd.__version__: '0.16.2', np.__version__: '1.9.2'。
  • 我刚刚在一台机器上尝试过这个,pandas 版本:0.15.0 和 numpy 版本 1.8.0。此操作 (x * y[:, None]) 仍然不起作用。我怀疑这是由 pandas 或 numpy 版本引起的问题。

标签: python numpy pandas array-broadcasting


【解决方案1】:

我找到了另一种方法来在 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

【讨论】:

  • 不错。此外, df.multiply() 看起来等同于 df.mul()
【解决方案2】:

我认为你最好使用 df.apply() 方法。在你的情况下:

x.apply(lambda x: x * y)

【讨论】:

  • 谢谢,我试过这个:x.apply(lambda x: x * y),它对我有用。
  • 是的,魏丽说的没错。抱歉——我在原始答案中使用了传统的“df”,因为我认为使用“x”可能会导致内部和外部范围内的变量混淆。
猜你喜欢
  • 1970-01-01
  • 2016-05-16
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多