元素明确的2个DataFrames的乘法

时间:2015-09-05 14:45:29

标签: python pandas dataframe

有2个形状(6,4)和(6,2)的数据帧。需要执行2个数据帧的元素相乘。

>>> import pandas as pd
>>> df1 = pd.DataFrame({'col1' : [1,2,6,8,-1,3], 'col2' : [1,2,6,8,-1,3], 'col3' : [1,2,6,8,-1,3], 'col4' : [1,2,6,8,-1,3]})
>>> df1
   col1  col2  col3  col4
0     1     1     1     1
1     2     2     2     2
2     6     6     6     6
3     8     8     8     8
4    -1    -1    -1    -1
5     3     3     3     3
>>>
>>> df2 = pd.DataFrame({'col1' : [9,8,7,1,1,1], 'col2' : [11,12,16,2,2,1]})
>>> df2
   col1  col2
0     9    11
1     8    12
2     7    16
3     1     2
4     1     2
5     1     1

预期产出:

0     9     9       9       9       
1     16    16      16      16      
2     42    42      42      42      
3     8     8       8       8       
4     -1    -1      -1      -1      
5     3     3       3       3       

0   11      11      11      11
1   24      24      24      24
2   96      96      96      96
3   16      16      16      16
4   -2      -2      -2      -2
5   3       3       3       3

方法1:

a = np.array(df1.values)
b = np.array(df2.values)

尝试以下方式,

c = a * b

错误:#ValueError:操作数无法与形状(6,4)和(6,2)一起广播

方法2:

将1个数据帧转换为系列。

df_temp=df1[df1.columns.values['a']]
func = lambda x: np.asarray(x) * np.asarray(df2[df2.columns.values[0]])

df_temp.apply(func)

输出: 没有得到元素明智的输出。

方法3:

将DF转换为列表并乘以列表:

df11=list(df1.values.flatten())
df22=list(df2.values.flatten())

但是,结果列表不是2维;它的1维。

4 个答案:

答案 0 :(得分:1)

如果你可以将输出变为numpy数组,这种方式可以正常工作

map(lambda col: df2[col].values.reshape(-1, 1) * df1.values, df2)

编辑:这个更干净,输出为pandas dfs:

map(lambda col: df1.mul(df2[col], axis=0), df2)

答案 1 :(得分:1)

你应该使用.multiply():

import pandas as pd

df1 = pd.DataFrame({'col1' : [1,2,6,8,-1,3], 'col2' : [1,2,6,8,-1,3], 
    'col3' : [1,2,6,8,-1,3], 'col4' : [1,2,6,8,-1,3]})
df2 = pd.DataFrame({'col1' : [9,8,7,1,1,1], 'col2' : [11,12,16,2,2,1]})

for x in range(len(df2.columns)):
    new_df = df1.multiply(df2.iloc[:, x], axis=0)
    print new_df

返回:

   col1  col2  col3  col4
0     9     9     9     9
1    16    16    16    16
2    42    42    42    42
3     8     8     8     8
4    -1    -1    -1    -1
5     3     3     3     3

   col1  col2  col3  col4
0    11    11    11    11
1    24    24    24    24
2    96    96    96    96
3    16    16    16    16
4    -2    -2    -2    -2
5     3     3     3     3

答案 2 :(得分:1)

您应该可以使用以下方式创建您要查找的结果:

>>> [df1.apply(lambda x: x*y) for _, y in df2.iteritems()]
[   col1  col2  col3  col4
 0     9     9     9     9
 1    16    16    16    16
 2    42    42    42    42
 3     8     8     8     8
 4    -1    -1    -1    -1
 5     3     3     3     3,
    col1  col2  col3  col4
 0    11    11    11    11
 1    24    24    24    24
 2    96    96    96    96
 3    16    16    16    16
 4    -2    -2    -2    -2
 5     3     3     3     3]

或者使用@Alex乘法方法,这也是一样的。您还可以将它们连接成一个多索引数据框:

>>> pd.concat((df1.mul(y, axis=0) for _, y in df2.iteritems()), axis=1, keys=df2)
  col1                col2               
  col1 col2 col3 col4 col1 col2 col3 col4
0    9    9    9    9   11   11   11   11
1   16   16   16   16   24   24   24   24
2   42   42   42   42   96   96   96   96
3    8    8    8    8   16   16   16   16
4   -1   -1   -1   -1   -2   -2   -2   -2
5    3    3    3    3    3    3    3    3

答案 3 :(得分:0)

感谢@Alex的详细信息..

(df1.mul(y,axis = 0)表示_,y表示df2.iteritems())