对 pandas DataFrame 中重复出现的一组数字进行分组

Grouping a set of numbers that reoccur in a pandas DataFrame

假设我有以下数据框

holder
0
1
2
0
1
2
0
1
0
1
2

我希望能够对从 0 开始到最大值结束的每组数字进行分组,并为该组分配一个值。 所以

holder  group
0        1
1        1
2        1
0        2
1        2
2        2
0        3
1        3
0        4
1        4
2        4

我试过: n=3

df['group'] = [int(i/n) for i,x in enumerate(df.holder)]

但是这个returns

holder  group
0        1
1        1
2        1
0        2
1        2
2        2
0        3
1        3
0        3
1        4
2        4

假设 holder 是单调非递减的,直到另一个 0 出现,您可以通过求和来识别零并创建组。

df = pd.DataFrame({'holder': [0, 1, 2, 0, 1, 2, 0, 1, 0, 1, 2]})
# identify 0s and create groups
df['group'] = df['holder'].eq(0).cumsum()
print(df)
    holder  group
0        0      1
1        1      1
2        2      1
3        0      2
4        1      2
5        2      2
6        0      3
7        1      3
8        0      4
9        1      4
10       2      4

假设每组的数字一直在增加,你可以检查数字是否小于或等于之前的数字,然后进行累加和,将布尔值变成组数。

df['group'] = df['holder'].diff().le(0).cumsum() + 1

结果:

    holder  group
0        0      1
1        1      1
2        2      1
3        0      2
4        1      2
5        2      2
6        0      3
7        1      3
8        0      4
9        1      4
10       2      4

(在两个相邻的 0 的情况下,我专门使用 <= 而不是 <。)

这是受Nickil Maveli's answer on "Groupby conditional sum of adjacent rows" but the cleaner method was posted by d.b in a comment here的启发。