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