2015-04-24 39 views
2

我有兩個數據幀,我想通過索引來乘以它們。什麼是最好的方法來做到這一點? 注意:列名稱不同。在python熊貓中乘以兩個具有相似索引的數據幀

df1 = pd.DataFrame([(1,2,3),(3,4,5),(5,6,7)], columns=['a','b','d'], index = ['A', 'B','C']) 
df1 
    a b d 
A 1 2 3 
B 3 4 5 
C 5 6 7 

df2 = pd.DataFrame([(10,20,30)], columns=['A','B','C'],index = ['ss']) 
df2 = df2.transpose() 
df2 
    ss 
A 10 
B 20 
C 30 

輸出數據幀:

 a b d 
A 10 20 30 
B 60 80 100 
C 150 180 210 

回答

4

呼叫mul和系列轉換到一個列表,並通過axis=0,通過轉換爲列表我們忽略索引/列名稱的任何對齊錯誤:

In [74]: 

df1.mul(list(df2['ss']), axis=0) 
Out[74]: 
    a b d 
A 10 20 30 
B 60 80 100 
C 150 180 210 

編輯

無需轉換到一個列表只是直接訪問系列:

In [75]: 

df1.mul(df2['ss'], axis=0) 
Out[75]: 
    a b d 
A 10 20 30 
B 60 80 100 
C 150 180 210 
+0

試一下:df2 = pd.DataFrame([(10,20,30)],columns = ['A','C','D'],index = ['ss'])T – Alexander

+0

@Alexander the OP特別發佈了兩個df具有相同索引的示例 – EdChum

+0

同意@EdChum在這裏。即使用@亞歷山大的例子,你仍然可以放棄不匹配的索引嗎? 'df1.mul(df2 ['ss'],axis ='index')。dropna()' – Zero

2

的一種方法是對numpy的陣列乘以像

In [8]: pd.DataFrame(df1.values*df2.values, 
         columns=['a','b','d'], index = ['A', 'B','C']) 
Out[8]: 
    a b d 
A 10 20 30 
B 60 80 100 
C 150 180 210 
+0

如果矩陣和向量(df2)不共享相同的索引,將會產生錯誤。 – Alexander

+0

好點。 @ EdChum的解決方案是一種更簡潔的方式。 – Zero

2

如果你想乘一列DF不其列名稱方面,它的更好使其成爲一個系列,你可以用.squeeze()方法做到這一點。然後:

>>> df1.mul(df2.squeeze(), axis='index') 
     a b d 
A 10 20 30 
B 60 80 100 
C 150 180 210 
1

爲了得到下面的輸出數據幀,如上:

a b d 
A 10 20 30 
B 60 80 100 
C 150 180 210 

...執行以下命令:

df3 = pandas.DataFrame(df1.values*df2.values, columns=df1.columns, index=df1.index) 

此進行逐列相乘。