如何创建在 Python 组的子组内递增的新列?
How to create a new column that increments within a subgroup of a group in Python?
我遇到了一个问题,我需要将数据分成两组,并附上一个对子组进行计数的列。
示例数据框如下所示:
colA colB
1 a
1 a
1 c
1 c
1 f
1 z
1 z
1 z
2 a
2 b
2 b
2 b
3 c
3 d
3 k
3 k
3 m
3 m
3 m
附加新列后的预期输出如下:
colA colB colC
1 a 1
1 a 1
1 c 2
1 c 2
1 f 3
1 z 4
1 z 4
1 z 4
2 a 1
2 b 2
2 b 2
2 b 2
3 c 1
3 d 2
3 k 3
3 k 3
3 m 4
3 m 4
3 m 4
我尝试了以下方法,但无法解决这个看似微不足道的问题:
我试过的解决方案 1 不符合我的要求:
df['ONES']=1
df['colC']=df.groupby(['colA','colB'])['ONES'].cumcount()+1
df.drop(columns='ONES', inplace=True)
我也玩过 transform 和 cumsum 函数,并应用过,但我似乎无法解决这个问题。感谢任何帮助。
编辑:数据帧上的小错误。
编辑 2:为简单起见,我为 B 列显示了相似的值,但问题是在一个更大的组中(由 colA 表示),colB 可能不同,因此,它需要在同时.
编辑 3:更新了数据框以强调我第二次编辑的意思。希望这会使它更清晰和可重现。
您可以使用 groupby
+ ngroup
:
df['colC'] = df.groupby('colA').apply(lambda x: x.groupby('colB').ngroup()+1).droplevel(0)
输出:
colA colB colC
0 1 a 1
1 1 a 1
2 1 c 2
3 1 c 2
4 1 f 3
5 1 z 4
6 1 z 4
7 1 z 4
8 2 a 1
9 2 b 2
10 2 b 2
11 2 b 2
12 3 c 1
13 3 d 2
14 3 k 3
15 3 k 3
16 3 m 4
17 3 m 4
18 3 m 4
断然分解
df['colC'] =df['colB'].astype('category').cat.codes+1
colA colB colC
0 1 a 1
1 1 a 1
2 1 b 2
3 1 b 2
4 1 c 3
5 1 d 4
6 1 d 4
7 1 d 4
8 2 a 1
9 2 b 2
10 2 b 2
11 2 b 2
12 3 a 1
13 3 b 2
14 3 c 3
15 3 c 3
16 3 d 4
17 3 d 4
18 3 d 4
我遇到了一个问题,我需要将数据分成两组,并附上一个对子组进行计数的列。
示例数据框如下所示:
colA colB
1 a
1 a
1 c
1 c
1 f
1 z
1 z
1 z
2 a
2 b
2 b
2 b
3 c
3 d
3 k
3 k
3 m
3 m
3 m
附加新列后的预期输出如下:
colA colB colC
1 a 1
1 a 1
1 c 2
1 c 2
1 f 3
1 z 4
1 z 4
1 z 4
2 a 1
2 b 2
2 b 2
2 b 2
3 c 1
3 d 2
3 k 3
3 k 3
3 m 4
3 m 4
3 m 4
我尝试了以下方法,但无法解决这个看似微不足道的问题:
我试过的解决方案 1 不符合我的要求:
df['ONES']=1
df['colC']=df.groupby(['colA','colB'])['ONES'].cumcount()+1
df.drop(columns='ONES', inplace=True)
我也玩过 transform 和 cumsum 函数,并应用过,但我似乎无法解决这个问题。感谢任何帮助。
编辑:数据帧上的小错误。
编辑 2:为简单起见,我为 B 列显示了相似的值,但问题是在一个更大的组中(由 colA 表示),colB 可能不同,因此,它需要在同时.
编辑 3:更新了数据框以强调我第二次编辑的意思。希望这会使它更清晰和可重现。
您可以使用 groupby
+ ngroup
:
df['colC'] = df.groupby('colA').apply(lambda x: x.groupby('colB').ngroup()+1).droplevel(0)
输出:
colA colB colC
0 1 a 1
1 1 a 1
2 1 c 2
3 1 c 2
4 1 f 3
5 1 z 4
6 1 z 4
7 1 z 4
8 2 a 1
9 2 b 2
10 2 b 2
11 2 b 2
12 3 c 1
13 3 d 2
14 3 k 3
15 3 k 3
16 3 m 4
17 3 m 4
18 3 m 4
断然分解
df['colC'] =df['colB'].astype('category').cat.codes+1
colA colB colC
0 1 a 1
1 1 a 1
2 1 b 2
3 1 b 2
4 1 c 3
5 1 d 4
6 1 d 4
7 1 d 4
8 2 a 1
9 2 b 2
10 2 b 2
11 2 b 2
12 3 a 1
13 3 b 2
14 3 c 3
15 3 c 3
16 3 d 4
17 3 d 4
18 3 d 4