2016-05-01 25 views
1

我有兩個dataframes,第一個df1只包含一行:乘dataframes提供關於列名目前存在的長度

A B C D E 
0 5 8 9 5 0 

,第二個具有多行,但相同的列數:

D C E A B 
0 5 0 3 3 7 
1 9 3 5 2 4 
2 7 6 8 8 1 
3 6 7 7 8 1 
4 5 9 8 9 4 
5 3 0 3 5 0 
6 2 3 8 1 3 
7 3 3 7 0 1 
8 9 9 0 4 7 
9 3 2 7 2 0 

在實際的例子中,我有更多的列(超過100)。這兩個數據框具有相同的列數和相同的列名稱,但列的順序不同,如示例中所示。 我應該乘以兩個數據幀(matrix_like乘法),除了我不能執行簡單df2.values * df1.values,因爲列沒有以相同的方式排序,所以例如df1 B的第二列不能在第二個因爲我們發現C而不是B在df2的第二列,而列B是df2的第5列。

是否有簡單和pythonic的解決方案乘以數據幀,考慮到列名螞蟻而不是列索引?

回答

4

df1[df2.columns]返回其中列排序爲DF2一個數據幀:

df1 
Out[91]: 
    A B C D E 
0 3 8 9 5 0 

df1[df2.columns] 
Out[92]: 
    D C E A B 
0 5 9 0 3 8 

所以,你只需要:

df2.values * df1[df2.columns].values 

,如果你有DF2附加列這將引發一個關鍵的錯誤;即使您在df1中有更多列,它也只會選擇df2的列。

由於@MaxU指出,因爲您在操作上numpy的陣列,以返回到數據幀結構,你將需要:

pd.DataFrame(df2.values * df1[df2.columns].values, columns = df2.columns) 
2

您可以使用muldf1ix轉化爲Serie

print df1.ix[0] 
A 5 
B 8 
C 9 
D 5 
E 0 
Name: 0, dtype: int64 

print df2.mul(df1.ix[0]) 
    A B C D E 
0 15 56 0 25 0 
1 10 32 27 45 0 
2 40 8 54 35 0 
3 40 8 63 30 0 
4 45 32 81 25 0 
5 25 0 0 15 0 
6 5 24 27 10 0 
7 0 8 27 15 0 
8 20 56 81 45 0 
9 10 0 18 15 0 

如果您需要更改的最終DataFrame順序,reindex_axis使用:

print df2.mul(df1.ix[0]).reindex_axis(df2.columns.tolist(), axis=1) 
    D C E A B 
0 25 0 0 15 56 
1 45 27 0 10 32 
2 35 54 0 40 8 
3 30 63 0 40 8 
4 25 81 0 45 32 
5 15 0 0 25 0 
6 10 27 0 5 24 
7 15 27 0 0 8 
8 45 81 0 20 56 
9 15 18 0 10 0 

另一種解決方案是通過df2.columnsSeriereindexindex列重新排序:

print df2.mul(df1.ix[0].reindex(df2.columns)) 
    D C E A B 
0 25 0 0 15 56 
1 45 27 0 10 32 
2 35 54 0 40 8 
3 30 63 0 40 8 
4 25 81 0 45 32 
5 15 0 0 25 0 
6 10 27 0 5 24 
7 15 27 0 0 8 
8 45 81 0 20 56 
9 15 18 0 10 0 
+0

感謝您的回答,我就算打上一個又一個爲正確的,因爲我發現它更Python,你的解決方案有趣並且運作得很好,所以我高興地讚揚了它! – Amanda

+0

謝謝upvoting。 – jezrael