Python 基于带熊猫的列的sumproduct
我有一个包含数值和Python 基于带熊猫的列的sumproduct,python,pandas,Python,Pandas,我有一个包含数值和NaN值的数据框。我想以某种方式应用加权和,在另一个数据帧(单行“加权方案”)中指定权重,如下所示: NaN值将被视为1。我希望结果成为原始数据帧中的一个新列,Wgt\u sum,从而产生 df = Score_1 Score_2 Score 3 Score 4 Score_5 Wgt_sum 0 1.0 6.0 3.0
NaN
值的数据框。我想以某种方式应用加权和,在另一个数据帧(单行“加权方案”)中指定权重,如下所示:
NaN
值将被视为1
。我希望结果成为原始数据帧中的一个新列,Wgt\u 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
-组成,如权重
数据框中所述,NaN
值已与1
一起使用
此外,weights
中的列可能与指定的列不同,因此我想要一个“通用”解决方案,其中weights
的列在df
和weights
中使用
有什么聪明的解决方案吗
谢谢如果每行df的权重相同,那么真正的权重应该是一个系列,而不是一个数据帧,因为它的索引没有携带任何信息。因此:
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
的列,如果df的每一行都有相同的权重,那么真正的权重应该是一个系列,而不是一个数据帧,因为它的索引没有携带任何信息。因此:
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
的列,我说的权重
数据帧的行数与df
数据帧的行数相同,这是正确的吗?不幸的是,没有。到目前为止,它只由一行组成-但我当然认为可以使用相同的值对其进行扩展或更改,以获得相同的行数大小为df…我说的weights
dataframe与df
dataframe具有相同的行数是正确的吗?不幸的是,没有。到目前为止,它只由一行组成-当然,我认为可以使用相同的值扩展或更改它,以便具有与df相同的大小…Hi@DSM-这只会使用匹配的列?这样我就不会冒这样的风险:df.Score_1*weights.Score_1(正确)+df.Score_2*weights.Score_2(正确)+df.Score_3*weights.Score_4(错误)@gussilago:yep.@gussilago但它只在列名实际匹配的情况下才起作用(在数据框中称为“Score 4”
,但在您的权重中它被称为“Score_4”
)。您好@DSM-这会只使用匹配的列吗?这样我就不会冒这样的风险:df.Score_1*weights.Score_1(正确)+df.Score_2*weights.Score_2(正确)+df.Score_3*weights.Score_4(错误)@gussilago:yep.@gussilago但它只在列名实际匹配的情况下才起作用(在数据框中称为“Score 4”
,但在你的体重中它被称为“分数4”
)。