Pandas:两个数据帧的逐元素乘法

31

我知道如何在两个Pandas数据帧之间进行逐元素乘法。然而,当两个数据框的维度不兼容时,情况会变得更加复杂。例如下面的df * df2很简单,但是df * df3就有问题:

df = pd.DataFrame({'col1' : [1.0] * 5, 
                   'col2' : [2.0] * 5, 
                   'col3' : [3.0] * 5 }, index = range(1,6),)
df2 = pd.DataFrame({'col1' : [10.0] * 5, 
                    'col2' : [100.0] * 5, 
                    'col3' : [1000.0] * 5 }, index = range(1,6),)
df3 = pd.DataFrame({'col1' : [0.1] * 5}, index = range(1,6),)

df.mul(df2, 1) # element by element multiplication no problems

df.mul(df3, 1) # df(row*col) is not equal to df3(row*col)
   col1  col2  col3
1   0.1   NaN   NaN
2   0.1   NaN   NaN
3   0.1   NaN   NaN
4   0.1   NaN   NaN
5   0.1   NaN   NaN
在上述情况下,如何将df的每一列与df3.col1相乘?
我的尝试是:我尝试复制df3.col1 len(df.columns.values)次,以获得与df相同维度的数据框:
df3 = pd.DataFrame([df3.col1 for n in range(len(df.columns.values)) ])
df3
        1    2    3    4    5
col1  0.1  0.1  0.1  0.1  0.1
col1  0.1  0.1  0.1  0.1  0.1
col1  0.1  0.1  0.1  0.1  0.1

但是这将创建一个3*5的数据框,而我需要的是5*3。我知道我可以使用df3.T()来获取所需的结果,但我认为这不是最快的方法。


1
这个回答解决了你的问题吗?如何在Pandas中将多列乘以一列 - AMC
那里的答案更好。 - AMC
5个回答

40
In [161]: pd.DataFrame(df.values*df2.values, columns=df.columns, index=df.index)
Out[161]: 
   col1  col2  col3
1    10   200  3000
2    10   200  3000
3    10   200  3000
4    10   200  3000
5    10   200  3000

谢谢unutbu。pd.DataFrame(df.values*df3.values, columns=df.columns, index=df.index) 也会保留索引,对吗? - Zhubarb

22

一种更简单的方法是将你想要保留列名称的数据框与其他数据框中的值(即numpy数组)进行乘法运算,如下所示:

In [63]: df * df2.values
Out[63]: 
   col1  col2  col3
1    10   200  3000
2    10   200  3000
3    10   200  3000
4    10   200  3000
5    10   200  3000

这种方法可以避免编写所有的新数据框架样板。


5
为了利用Pandas的广播属性,您可以使用 multiply
df.multiply(df3['col1'], axis=0)

3
这对我有效:
mul = df.mul(df3.c, axis=0)

或者,当您想进行减法(除法)时:
sub = df.sub(df3.c, axis=0)
div = df.div(df3.c, axis=0)

如果您将此应用于df(例如,如果df中有一个nan),它也可以正常工作(例如:df.iloc [0] ['col2'] = np.nan)。


这个不起作用。如果你的意思是 df.mul(df3.col1, axis=0),请重新编写它。 - IanHacker

1
另一种方法是创建列的列表并将它们连接起来:
cols = [pd.DataFrame(df[col] * df3.col1, columns=[col]) for col in df]
mul = cols[0].join(cols[1:])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接