【问题标题】:pandas fillna in column with cumsum of previous rows (reset after every nan)pandas fillna 在列中包含前行的累积(在每个 nan 之后重置)
【发布时间】:2020-04-30 06:34:27
【问题描述】:

我找到了一种按行解决此问题的解决方案,但有没有一种按列快速解决的方法?

以下是数据框的快速示例:

import pandas as pd
import numpy as np

df = pd.DataFrame([['GB',43.76],
['TEN',17.3],
['ARI',0.2],
['ATL',12.3],
['HOU',21.1],
['ARI',1.7],
['ATL',12.6],
['SF',15.0],
['GB',5.7],
[1.0,np.nan],
['GB',43.76],
['TEN',17.3],
['ARI',0.2],
['ATL',12.3],
['HOU',21.1],
['ARI',1.7],
['ATL',12.6],
['BUF',7.0],
['GB',5.7],
[2.0,np.nan]], columns = ['team','points'])

我一直在试图操纵df['sum'] = df['points'].cumsum()。显然它会累积总和,但我需要它做的是在/如果到达nan 时重新启动,而不是跳过它。

【问题讨论】:

    标签: python pandas cumsum fillna


    【解决方案1】:

    GroupBy.cumsum 与另一个cumsum 检查缺失值创建的助手系列一起使用:

    df['sum'] = df.groupby(df['points'].isna().cumsum())['points'].cumsum()
    print (df)
       team  points     sum
    0    GB   43.76   43.76
    1   TEN   17.30   61.06
    2   ARI    0.20   61.26
    3   ATL   12.30   73.56
    4   HOU   21.10   94.66
    5   ARI    1.70   96.36
    6   ATL   12.60  108.96
    7    SF   15.00  123.96
    8    GB    5.70  129.66
    9     1     NaN     NaN
    10   GB   43.76   43.76
    11  TEN   17.30   61.06
    12  ARI    0.20   61.26
    13  ATL   12.30   73.56
    14  HOU   21.10   94.66
    15  ARI    1.70   96.36
    16  ATL   12.60  108.96
    17  BUF    7.00  115.96
    18   GB    5.70  121.66
    19    2     NaN     NaN
    

    【讨论】:

      【解决方案2】:

      另一种不使用groupby 并假设所有点都是正数的方法,您可以在点上使用cumsumffill 使用前一个值的nan,然后删除@ 987654321@指向isna的值如下:

      df['s'] = df['points'].cumsum().ffill()
      df['s'] -= (df['s']*df['points'].isna()).cummax()
      print (df)
         team  points       s
      0    GB   43.76   43.76
      1   TEN   17.30   61.06
      2   ARI    0.20   61.26
      3   ATL   12.30   73.56
      4   HOU   21.10   94.66
      5   ARI    1.70   96.36
      6   ATL   12.60  108.96
      7    SF   15.00  123.96
      8    GB    5.70  129.66
      9     1     NaN    0.00
      10   GB   43.76   43.76
      11  TEN   17.30   61.06
      12  ARI    0.20   61.26
      13  ATL   12.30   73.56
      14  HOU   21.10   94.66
      15  ARI    1.70   96.36
      16  ATL   12.60  108.96
      17  BUF    7.00  115.96
      18   GB    5.70  121.66
      19    2     NaN    0.00
      

      【讨论】:

        【解决方案3】:

        不确定这是否与 jezrael 的解决方案相同,但我建议创建一个表示求和组的列,如 this question 中,您在其中检查 np.nan 而不是 0。然后对这些进行累积求和求和组。

        【讨论】:

          猜你喜欢
          • 2016-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-16
          • 1970-01-01
          • 2020-11-26
          • 1970-01-01
          相关资源
          最近更新 更多