groupby pandas 数据框中的连续相同值和出现次数的累积计数

groupby consecutive identical values in pandas dataframe and cumulative count of the number of occurences

我有一个问题,我想计算滚动期间数据帧中当前值未更改的次数。

例如:

df = pd.DataFrame({'col':list('aaaabbab')})

会以某种方式给出

的输出
0
1
2
3
0
1
0
0

我一直在尝试以下内容

df['col'] = df['col'] == df['col'].shift(1)
df.rolling(window=3).sum().reset_index(drop=True, level=0)

我添加了滚动,因为我想查看滚动周期方面的完整数据集,但即使没有滚动周期,我也无法完全理解其中的逻辑。

我不确定我是否遗漏了一些简单的东西,或者这可能无法使用 shift

您需要为值的变化生成石斑鱼。为此,将每个值与前一个值进行比较并应用 cumsum。这为您提供 itertools.groupby 样式的组([1, 1, 1, 1, 2, 2, 3, 4]),最后分组并应用 cumcount.

df['count'] = (df.groupby(df['col'].ne(df['col'].shift()).cumsum())
                 .cumcount()
              )

输出:

  col  count
0   a      0
1   a      1
2   a      2
3   a      3
4   b      0
5   b      1
6   a      0
7   b      0

编辑:为了好玩,这里有一个使用 itertools 的解决方案(快得多):

from itertools import groupby, chain
df['count'] = list(chain(*(list(range(len(list(g)))) 
                           for _,g in  groupby(df['col']))))

注意。这运行得更快(在提供的示例中为 88 µs 与 707 µs)