Python 如何在加权平均中避免NaN?

Python 如何在加权平均中避免NaN?,python,python-3.x,pandas,algorithm,numpy,Python,Python 3.x,Pandas,Algorithm,Numpy,这是我的数据帧df: str1 str2 str3 str4 key1 3 4 2 5 key2 NaN 3 4 4 key3 NaN NaN NaN 2 向量w: [0.2, 0.3, 0.5] 我通常使用df.T.dot(w)来计算数据帧与向量之间的乘积。但我想知道,只要没有完整的NaN列,如何通过重新加权向量和计算来避免

这是我的数据帧df:

       str1    str2     str3     str4    
key1     3       4       2        5
key2    NaN      3       4        4
key3    NaN     NaN     NaN       2
向量w:

 [0.2, 0.3, 0.5]
我通常使用
df.T.dot(w)
来计算数据帧与向量之间的乘积。但我想知道,只要没有完整的NaN列,如何通过重新加权向量和计算来避免NaN值

我的例子如下:

对于第一列,我希望向量等于
v=[0.2+0.3+0.5,0,0]
并计算
[3,NaN,NaN]
[1,0,0]

对于第二列,我希望
v=[0.2+0.25,0.3+0.25,0]

对于第三列,我希望
v=[0.2+0.25,0.3+0.25,0]

对于第4列,我希望
v
保持不变,因为没有NaN

预期产出:

          str1   str2  str3    str4
    0      3     3.45   3.1     4.7

我不确定是否有简单的方法来处理
nan
值。您可能需要创建自己的点积函数来处理这些值。类似的方法可能会奏效:

df.apply(lambda x: (x * [1, 0, 0]).sum())

pandas
sum
方法自动忽略
nan
值,因此您不必自己显式查找值。您可能会将
[1,0,0]
替换为参考其他权重数组。我不确定您现在是如何安排将其集成到上述建议中的。

如果NaN值在内积中应表示“权重=0”,则在进行计算之前,请按如下方式修改您的数据帧:

df_without_nans = df.fillna(value=0.0)  # 'value' can be dropped
dot_product = df_without_nans.T.dot(w)

df.fillna(0).T.dot(w)
?预期的输出是什么?
[0.2+0.25,0.3+0.25,0]
从哪里来?@DanielMesejo我不知道为什么我没有想到替换
nan
。。。这实际上是更好的解决方案。这是因为
[str2,key2]=NaN
所以向量(0.5)中对应的值被拆分为向量的其他值。