对 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的启发。
假设我有以下数据框
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的启发。