使用Pandas分组进行的累计值计数

时间:2019-10-17 12:37:51

标签: python pandas pandas-groupby

我有以下DataFrame:

>>>> df = pd.DataFrame(data={
            'type': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
            'value': [0, 2, 3, 4, 0, 3, 2, 3, 0]})

>>> df
  type  value
0    A      0
1    A      2
2    A      3
3    B      4
4    B      0
5    B      3
6    C      2
7    C      3
8    C      0

我需要完成的工作如下:对于每种类型,请跟踪非零值的累积计数,但是每次遇到0值时都从零开始。

  type  value  cumcount
0    A      0         NaN
1    A      2         1
2    A      3         2
3    B      4         1
4    B      0         NaN
5    B      3         1
6    C      2         1
7    C      3         2
8    C      0         NaN

1 个答案:

答案 0 :(得分:6)

想法是创建连续的组并过滤掉非0值,最后使用过滤器分配给新列:

m = df['value'].eq(0)
g = m.ne(m.shift()).cumsum()[~m]

df.loc[~m, 'new'] = df.groupby(['type',g]).cumcount().add(1)
print (df)
  type  value  new
0    A      0  NaN
1    A      2  1.0
2    A      3  2.0
3    B      4  1.0
4    B      0  NaN
5    B      3  1.0
6    C      2  1.0
7    C      3  2.0
8    C      0  NaN

对于大熊猫0.24+,可以使用Nullable integer data type

df['new'] = df['new'].astype('Int64')
print (df)
  type  value  new
0    A      0  NaN
1    A      2    1
2    A      3    2
3    B      4    1
4    B      0  NaN
5    B      3    1
6    C      2    1
7    C      3    2
8    C      0  NaN