Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于带熊猫的列的sumproduct_Python_Pandas - Fatal编程技术网

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”
)。