【问题标题】:Perform cumulative sum on a column of pandas dataframe ignoring NAN对忽略 NAN 的 pandas 数据框列执行累积求和
【发布时间】:2020-07-23 20:41:48
【问题描述】:

我有一个如下的熊猫数据框。我想根据每个订单对“NEW1”列执行累积总和。下面的代码部分工作,但它并没有忽略 Nan 的意思,我预计最后一行的 'cumsum' 的值为 8

import pandas as pd
import numpy as np
df = pd.DataFrame({'ORDER':["A", "A", "B", "B"], 'NEW1':[np.nan, 5, 8, np.nan]})
df['cumsum'] = df.groupby(['ORDER'])['NEW1'].cumsum()
df

    ORDER   NEW1    cumsum
0   A       NaN     NaN
1   A       5.0     5.0
2   B       8.0     8.0
3   B       NaN     NaN

我的预期输出:

    ORDER   NEW1    cumsum
0   A       NaN     NaN
1   A       5.0     5.0
2   B       8.0     8.0
3   B       NaN     8.0

【问题讨论】:

  • 如果设置skipna=True会怎样?

标签: python pandas


【解决方案1】:

您可能必须将 apply 与 lambda 一起使用:

df['cumsum'] = df.groupby(['ORDER'])['NEW1'].apply(lambda x: x.fillna(0).cumsum())

【讨论】:

  • 对不起@Scott Boston,编辑错误。诚挚的歉意
【解决方案2】:

让我们使用expandingsum,它将按照您的喜好处理NaN

df['cumsum'] = df.groupby('ORDER')['NEW1'].expanding().sum().reset_index(0, drop=True)

  ORDER  NEW1  cumsum
0     A   NaN     NaN
1     A   5.0     5.0
2     B   8.0     8.0
3     B   NaN     8.0

【讨论】:

    【解决方案3】:

    fillna()groupby 之前,并使用transform

    df['cumsum']=df.fillna(0).groupby('ORDER')['NEW1'].transform('cumsum')
    
    
    
    ORDER  NEW1  cumsum
    0     A   NaN     0.0
    1     A   5.0     5.0
    2     B   8.0     8.0
    3     B   NaN     8.0
    

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 2014-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多