【问题标题】:Conditional sum of non zero values非零值的条件和
【发布时间】:2021-05-01 04:11:55
【问题描述】:

我有一个如下的 daraframe:

        Datetime     Data      Fn
0   18747.385417  11275.0       0
1   18747.388889   8872.0       1
2   18747.392361   7050.0       0
3   18747.395833   8240.0       1
4   18747.399306   5158.0       1
5   18747.402778   3926.0       0
6   18747.406250   4043.0       0
7   18747.409722   2752.0       1
8   18747.420139   3502.0       1
9   18747.423611   4026.0       1

我想计算列 (Fn) 的连续非零值的总和

我想要我的结果数据框如下:

        Datetime     Data      Fn     Sum
0   18747.385417  11275.0       0       0
1   18747.388889   8872.0       1       1
2   18747.392361   7050.0       0       0
3   18747.395833   8240.0       1       1
4   18747.399306   5158.0       1       2  <<<
5   18747.402778   3926.0       0       0
6   18747.406250   4043.0       0       0
7   18747.409722   2752.0       1       1
8   18747.420139   3502.0       1       2
9   18747.423611   4026.0       1       3

【问题讨论】:

  • 仅仅通过阅读标题,将零添加到总和不会改变总和值。也就是说,一段时间后我能够理解你的问题。我认为序列(seq)这个词更适合你在这里所说的 sum。

标签: python python-3.x pandas dataframe


【解决方案1】:

您可以使用groupby()cumsum()

groups = df.Fn.eq(0).cumsum()
df['Sum'] = df.Fn.ne(0).groupby(groups).cumsum()

详情

首先使用df.Fn.eq(0).cumsum() 创建连续非零的伪组。每个零将获得一个新的 id,而连续的非零将保持相同的 id:

groups = df.Fn.eq(0).cumsum()

#    groups  Fn (Fn added just for comparison)
# 0       1   0
# 1       1   1
# 2       2   0
# 3       2   1
# 4       2   1
# 5       3   0
# 6       4   0
# 7       4   1
# 8       4   1
# 9       4   1

然后将df.Fn.ne(0) 分组到这些伪组和cumsum() 以生成组内序列:

df['Sum'] = df.Fn.ne(0).groupby(groups).cumsum()

#        Datetime     Data  Fn  Sum
# 0  18747.385417  11275.0   0    0
# 1  18747.388889   8872.0   1    1
# 2  18747.392361   7050.0   0    0
# 3  18747.395833   8240.0   1    1
# 4  18747.399306   5158.0   1    2
# 5  18747.402778   3926.0   0    0
# 6  18747.406250   4043.0   0    0
# 7  18747.409722   2752.0   1    1
# 8  18747.420139   3502.0   1    2
# 9  18747.423611   4026.0   1    3

【讨论】:

    【解决方案2】:

    如何使用cumsum 并在值为0时重置

    df['Fn2'] = df['Fn'].replace({0: False, 1: True})
    df['Fn2'] = df['Fn2'].cumsum() - df['Fn2'].cumsum().where(df['Fn2'] == False).ffill().astype(int)
    df
    

    【讨论】:

      【解决方案3】:

      您可以将 fn 列存储在列表中,然后创建一个新列表并遍历存储的 fn 列并检查先前的索引值是否大于零,然后将其添加到当前索引,否则不要更新它,之后这你可以为列表创建一个数据框,并将列连接到现有的数据框

      fn=df[Fn]
      sum_list[0]=fn first value    
      for i in range(1,lenghtofthe column):    
         if fn[i-1]>0:
            sum_list.append(fn[i-1]+fn[i])    
         else:
            sum_list.append(fn[i])
      dfsum=pd.Dataframe(sum_list)
      df=pd.concat([df,dfsum],axis=1)
      

      希望这会对你有所帮助。可能会出现语法错误,你可以参考谷歌。但想法是这样的

      【讨论】:

        【解决方案4】:

        试试这个:

        sum_arr = [0]
        
        for val in df['Fn']:
            if val > 0:
                sum_arr.append(sum_arr[-1] + 1)
            else:
                sum_arr.append(0)
        
        df['sum'] = sum_arr[1:]
        
        df
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-05-07
          • 2015-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-23
          • 2021-05-21
          • 2020-10-20
          相关资源
          最近更新 更多