熊猫:两个数据帧的元素乘法

时间:2014-01-09 14:25:14

标签: python pandas multiplication dataframe

我知道如何在两个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()进行转置以得到我需要的东西,但我认为这不是最快的方式。

5 个答案:

答案 0 :(得分:27)

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

答案 1 :(得分:8)

更简单的方法是将要保留其名称的数据帧与另一个的值(即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

这样您就不必编写所有新的数据框样板文件了。

答案 2 :(得分:3)

这对我有用:

mul = df.mul(df3.c, axis=0)

或者,当您想要减去(除)时:

sub = df.sub(df3.c, axis=0)
div = df.div(df3.c, axis=0)

也适用于df中的nan(例如,如果您将其应用于df:df.iloc[0]['col2'] = np.nan)

答案 3 :(得分:1)

另一种方法是创建列列表并加入它们:

cols = [pd.DataFrame(df[col] * df3.col1, columns=[col]) for col in df]
mul = cols[0].join(cols[1:])

答案 4 :(得分:1)

要使用Pandas广播属性,您可以使用multiply

df.multiply(df3['col1'], axis=0)
相关问题