2015-04-24 38 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) 

此进行逐列相乘。