非零值的条件总和

Roh*_*a K 3 python dataframe python-3.x pandas

我有一个如下所示的 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
Run Code Online (Sandbox Code Playgroud)

我想计算列(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
Run Code Online (Sandbox Code Playgroud)

tdy*_*tdy 7

您可以使用groupby()cumsum()

groups = df.Fn.eq(0).cumsum()
df['Sum'] = df.Fn.ne(0).groupby(groups).cumsum()
Run Code Online (Sandbox Code Playgroud)

细节

首先用于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
Run Code Online (Sandbox Code Playgroud)

然后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
Run Code Online (Sandbox Code Playgroud)