Python 如何将pandas数据帧与具有广播功能的numpy阵列相乘
我有一个形状为(4,3)的数据框,如下所示: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
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