我有一个包含数值和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_1
,Score_2
和Score_4
列组成 - 如weights
DataFrame中所指定的那样,并且NaN
值已与1
一起使用。
此外,weights
中的列可能与指定的列不同,因此我想要一个" general"在weights
和df
中使用weights
列的解决方案...
这个的任何智能解决方案?
由于
答案 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
的列匹配。