如何在Pandas中对分组内每n行进行递增标记
问题描述
现有如下DataFrame:
import pandas as pd df = pd.DataFrame([["A",1],["A",2],["A",3],["B",4],["C",5],["C",6],["C",7],["C",8],["C",9],["C",10]],columns=["id","val"])
对应的表格:
| id | val |
|---|---|
| A | 1 |
| A | 2 |
| A | 3 |
| B | 4 |
| C | 5 |
| C | 6 |
| C | 7 |
| C | 8 |
| C | 9 |
| C | 10 |
需要新增一列grp,按id列分组后,每n行(示例中n=2)进行递增标记:同一id下每2行标记为同一序号,之后序号依次递增。预期输出如下:
df_out = pd.DataFrame([["A",1,1],["A",2,1],["A",3,2],["B",4,1],["C",5,1],["C",6,1],["C",7,2],["C",8,2],["C",9,3],["C",10,3]],columns=["id","val","grp"])
对应的表格:
| id | val | grp |
|---|---|---|
| A | 1 | 1 |
| A | 2 | 1 |
| A | 3 | 2 |
| B | 4 | 1 |
| C | 5 | 1 |
| C | 6 | 1 |
| C | 7 | 2 |
| C | 8 | 2 |
| C | 9 | 3 |
| C | 10 | 3 |
解决方案
可以通过Pandas的分组与累计计数方法实现,步骤如下:
- 按
id列分组,对每组内的行生成从0开始的连续计数 - 将计数结果按每组行间隔
n做整数除法,最后加1得到从1开始的分组序号
具体代码(以n=2为例):
n = 2 df['grp'] = df.groupby('id').cumcount() // n + 1
原理说明
df.groupby('id').cumcount():为每个id分组内的行生成从0开始的连续整数,比如id=A对应0,1,2,id=C对应0,1,2,3,4,5// n:整数除法会把每n个连续计数归为同一值,比如n=2时,0//2=0、1//2=0、2//2=1,以此实现每2行一组+1:将从0起始的分组序号转为从1起始,匹配预期输出格式
内容的提问来源于stack exchange,提问作者Chethan
相关产品推荐
相关产品推荐

