【问题标题】:sumproduct 2 dataframes with nan valuessumproduct 2 具有 nan 值的数据帧
【发布时间】:2021-09-16 10:58:43
【问题描述】:

有 2 个数据帧 df['x'] 和 df['y']。 如何将 2 个表相乘并对行求和?

x0  x1  x2      y0  y1  y2
2   5   9       2   3   4
Nan 4   7       2   2   3
3   Nan 3       1   2   3

期望的输出:
(2x2)+(5x3)+(9x4) = 55
等等。

Nan 应该被视为 0。
我用下面的代码不断地用 nan 值达到结果。
还有其他更有效的方法来解决这个问题吗?

df['z'] = (df['x'].to_numpy() * df['y'].to_numpy()).sum(axis=1)

【问题讨论】:

  • 遇到NaN应该怎么办?第二行应该是什么结果?
  • 在不改变原始值的情况下,Nan 应该被视为 0。

标签: python pandas dataframe sumproduct


【解决方案1】:

Pandas 支持 arithmetic operations over dataframe,并为它们提供灵活的包装器。

 df.method()   operator
------------------------
     add          +
     sub          -
     mul          *
     div          /
     mod          %
     pow          **

只需将原始数据帧与填充的 nan 值相乘。

#METHOD 1
(df_x.fillna(0)*df_y.values).sum(1)

或者你可以使用pd.DataFrame.mul(),它等同于*,但提供了添加fill_value的功能

#METHOD 2
df_x.mul(df_y.values, fill_value=0).sum(1)
0    55.0
1    29.0
2    12.0
dtype: float64

注意:如果 df_y 也是 nan 值,则将 df_y.values 替换为 df_y.fillna(0).values

【讨论】:

    【解决方案2】:

    尝试将filterregex 参数一起使用:

    df.filter(regex='x\d').mul(df.filter(regex='y\d').to_numpy()).sum(axis=1)
    

    或仅与filter(like=...)

    df.filter(like='x').mul(df.filter(like='y').to_numpy()).sum(axis=1)
    

    0    55.0
    1    29.0
    2    12.0
    dtype: float64
    

    【讨论】:

      猜你喜欢
      • 2022-10-01
      • 2022-11-25
      • 2021-08-17
      • 2020-09-05
      • 2016-10-26
      • 1970-01-01
      • 2021-11-21
      • 2018-04-06
      • 1970-01-01
      相关资源
      最近更新 更多