有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维。
答案 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())