如何在熊猫中将1 * m DataFrame乘以n * m DataFrame?

问题描述:

我有我要乘2大熊猫据帧:如何在熊猫中将1 * m DataFrame乘以n * m DataFrame?

frame_score: 
    Score1 Score2 
0  100  80 
1 -150  20 
2 -110  70 
3  180  99 
4  125  20 

frame_weights: 
    Score1 Score2 
0  0.6  0.4 

我想:

import pandas as pd 
import numpy as np 

frame_score = pd.DataFrame({'Score1' : [100, -150, -110, 180, 125], 
         'Score2' : [80, 20, 70, 99, 20]}) 

frame_weights = pd.DataFrame({'Score1': [0.6], 'Score2' : [0.4]}) 

print('frame_score: \n{0}'.format(frame_score)) 
print('\nframe_weights: \n{0}'.format(frame_weights)) 

# Each of the following alternatives yields the same results 
frame_score_weighted = frame_score.mul(frame_weights, axis=0) 
frame_score_weighted = frame_score * frame_weights 
frame_score_weighted = frame_score.multiply(frame_weights, axis=1) 

print('\nframe_score_weighted: \n{0}'.format(frame_score_weighted)) 

回报:

frame_score_weighted: 
    Score1 Score2 
0 60.0 32.0 
1  NaN  NaN 
2  NaN  NaN 
3  NaN  NaN 
4  NaN  NaN 

的1到4行是NaN。我怎样才能避免这种情况?例如,第1行应该是-90 8(-90 = -150 * 0.6; 8 = 20 * 0.4)。

例如,Numpy可能广播以匹配尺寸。

编辑:任意尺寸,尝试使用values来操纵类似阵列的方式dataframes值:

# element-wise multiplication 
frame_score_weighted = frame_score.values*frame_weights.values 

# change to pandas dataframe and rename columns 
frame_score_weighted = pd.DataFrame(data=frame_score_weighted, columns=['Score1','Score2']) 

#Out: 
    Score1 Score2 
0 60.0 32.0 
1 -90.0  8.0 
2 -66.0 28.0 
3 108.0 39.6 
4 75.0  8.0 

只需使用一些额外的索引,以确保您提取所需权重标当你做乘法。

frame_score['Score1'] = frame_score['Score1']*frame_weights['Score1'][0] 
frame_score['Score2'] = frame_score['Score2']*frame_weights['Score2'][0] 

frame_score 
#Out: 
    Score1 Score2 
0 60.0 32.0 
1 -90.0  8.0 
2 -66.0 28.0 
3 108.0 39.6 
4 75.0  8.0 

默认情况下,当pd.DataFramepd.Series相乘,pandas对准pd.Seriespd.DataFrame的列的索引。因此,我们通过访问第一行从frame_weights获得相关的pd.Series

frame_score * frame_weights.loc[0] 

    Score1 Score2 
0 60.0 32.0 
1 -90.0  8.0 
2 -66.0 28.0 
3 108.0 39.6 
4 75.0  8.0 

您可以在适当的位置

frame_score *= frame_weights.loc[0] 
编辑 frame_score