2014-01-09 32 views
11

我知道如何在兩個熊貓數據幀之間進行逐元素乘法。但是,當兩個數據框的尺寸不兼容時,情況會變得更加複雜。例如下面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 

在上述情況下,我怎麼能乘以df3.​​col1 DF的每列?

我嘗試:我試圖複製df3.col1len(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()轉置來獲得我需要的東西,但我認爲這不是最快的方法。

回答

22
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 
+0

謝謝unutbu。'pd.DataFrame(df.values * df3.values,columns = df.columns,index = df.index)'也保留索引,對吧? – Rhubarb

+0

是的,沒錯。 – unutbu

1

另一種方法是創建列的列表,並加入他們的行列:

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

更簡單的方法做,這是剛剛乘你想保持的價值觀,其colnames數據幀(即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 

這樣您就不必編寫所有新的數據框樣板文件。

1

這個工作對我來說:

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

或者,當你想減(分),而不是:

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

作品也有nan在DF(例如,如果您將此到df:df.iloc[0]['col2'] = np.nan)