【问题标题】:count of non null column values with range() pandasrange() 熊猫的非空列值计数
【发布时间】:2021-08-04 11:36:57
【问题描述】:

我有这样的数据框:

id     date     sum
a    1/1/2001  
a    1/1/2001
a    1/1/2001
a    1/1/2001    50
a    1/1/2001    10
a    1/1/2001    60
b    1/1/2001
b    1/1/2001
b    1/1/2001    100
b    1/1/2001    100
b    1/1/2001    
b    1/1/2001    100

我想要一个名为 Rolling 的新列,它将是 cumsum/cumcount 但问题是 cumsum 没有将空值添加为空值,但分母计数也采用空值。我的代码是

df['Rolling'] = df.groupby('id').apply(lambda x: x['sum'].cumsum()/ range(1,len(x)+1))).values

我希望我的输出为:

id     date     sum  Rolling
a    1/1/2001  
a    1/1/2001
a    1/1/2001
a    1/1/2001    50    50  #50/1
a    1/1/2001    10    30  #50+10/2
a    1/1/2001    60    40  #50+10+60/3
b    1/1/2001
b    1/1/2001
b    1/1/2001    100  100  #100/1
b    1/1/2001    100  100  #100+100/2
b    1/1/2001    
b    1/1/2001    100  100    #300/3 

但我得到的是:

id     date     sum  Rolling
a    1/1/2001  
a    1/1/2001
a    1/1/2001
a    1/1/2001    50    12.5  #50/4
a    1/1/2001    10    12    #50+10/5
a    1/1/2001    60    20  #50+10+60/6
b    1/1/2001
b    1/1/2001
b    1/1/2001    100  33.33 #100/3
b    1/1/2001    100  50    #200/4
b    1/1/2001    
b    1/1/2001    100  50    #300/6   

【问题讨论】:

    标签: python pandas range cumsum


    【解决方案1】:

    让我们尝试修复您的代码

    df['mean'] = df.groupby('id')['sum'].apply(
                 lambda s: s.cumsum() / s.notna().cumsum())
    

    替代方法Group id 的数据框,然后在 sum 列上计算 expanding meanmean 操作默认排除 Null 值,因此我们不必担心跟踪非 Null 值

    df['mean'] = df.groupby('id').expanding()['sum'].mean().droplevel(0)
    df['mean'] = df['mean'].mask(df['sum'].isna())
    

       id      date    sum   mean
    0   a  1/1/2001    NaN    NaN
    1   a  1/1/2001    NaN    NaN
    2   a  1/1/2001    NaN    NaN
    3   a  1/1/2001   50.0   50.0
    4   a  1/1/2001   10.0   30.0
    5   a  1/1/2001   60.0   40.0
    6   b  1/1/2001    NaN    NaN
    7   b  1/1/2001    NaN    NaN
    8   b  1/1/2001  100.0  100.0
    9   b  1/1/2001  100.0  100.0
    10  b  1/1/2001    NaN    NaN
    11  b  1/1/2001  100.0  100.0
    

    【讨论】:

      猜你喜欢
      • 2019-07-13
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多