sumproduct基于Pandas的列

时间:2018-06-14 12:11:03

标签: python pandas

我有一个包含数值和NaN值的DataFrame。我想以某种方式应用加权和,并在另一个DataFrame(单行'加权方案')中指定权重:

df =    

                     Score_1     Score_2     Score 3     Score 4     Score_5
0                    1.0         6.0         3.0         10.0        8.0  
1                    5.0         NaN         9.0         NaN         1.0
2                    10.0        NaN         NaN         5.0         3.0
...

weights
                     Score_1        Score_2        Score_4
0                    0.25           0.70           0.05   

NaN值将被视为1。我希望结果在原始DataFrame中成为新列Wgt_sum,产生

df =    

                     Score_1     Score_2     Score 3     Score 4    Score_5    Wgt_sum 
0                    1.0         6.0         3.0         10.0       8.0        4.95
1                    5.0         NaN         9.0         NaN        1.0        2.0
2                    10.0        NaN         NaN         5.0        3.0        3.45
...

请注意,Wgt_sum应仅由Score_1Score_2Score_4列组成 - 如weights DataFrame中所指定的那样,并且NaN值已与1一起使用。

此外,weights中的列可能与指定的列不同,因此我想要一个" general"在weightsdf中使用weights列的解决方案...

这个的任何智能解决方案?

由于

1 个答案:

答案 0 :(得分:3)

如果你对df的每一行都有相同的权重,那么真正的权重应该是Series而不是DataFrame,因为它的索引不包含任何信息。所以:

In [152]: df["Wgt_sum"] = (df.fillna(1) * weights.iloc[0]).sum(axis=1)

In [153]: df
Out[153]: 
   Score_1  Score_2  Score 3  Score 4  Score_5  Wgt_sum
0      1.0      6.0      3.0     10.0      8.0     4.95
1      5.0      NaN      9.0      NaN      1.0     2.00
2     10.0      NaN      NaN      5.0      3.0     3.45

.iloc[0]只是选择第一行权重。

我们可以通过查看预和输出来确认它是否正确对齐:

In [165]: df.fillna(1) * weights.iloc[0]
Out[165]: 
   Score 3  Score 4  Score_1  Score_2  Score_5
0      NaN     0.50     0.25      4.2      NaN
1      NaN     0.05     1.25      0.7      NaN
2      NaN     0.25     2.50      0.7      NaN

weights.iloc[0]的索引标签与df的列匹配。