如何在Pandas中按两列分组,生成跨Col1重置的唯一ID?
解决Pandas分组内生成重置ID的问题
你的需求是在同一Col1分组内,不同Col2对应ID从1开始递增,Col1变更时ID重置为1,之前的代码df["NewID"] = df.groupby(['Col1','Col12'] ).ngroup().add(1).astype(str)无法实现的原因是:ngroup()是对全局所有(Col1, Col2)组合进行连续编号,不会在Col1变化时重置计数。
正确实现方案
可以通过先按Col1分组,再在组内对Col2进行密集排名或者结合factorize生成组内唯一ID来实现:
方法1:使用groupby + rank(推荐)
利用rank的method='dense'参数,在每个Col1组内为不同的Col2分配连续的ID:
df["NewID"] = df.groupby('Col1')['Col2'].rank(method='dense', ascending=True).astype(int).astype(str)
method='dense':确保相同Col2对应同一ID,不同Col2按顺序递增,不会出现跳号astype(int):将排名的浮点数转为整数,再转字符串符合你的需求
方法2:使用groupby + transform + factorize
通过factorize在每个组内生成从0开始的索引,再加1转为从1开始:
def get_group_id(col): return pd.Series(pd.factorize(col)[0] + 1, index=col.index) df["NewID"] = df.groupby('Col1')['Col2'].transform(get_group_id).astype(str)
factorize会将组内的Col2值映射为0开始的整数,加1后得到从1开始的IDtransform保证结果和原DataFrame的索引对齐
示例验证
假设你的数据如下:
| Col1 | Col2 |
|---|---|
| A | X |
| A | Y |
| A | X |
| B | X |
| B | Z |
运行方法1后,NewID列结果为:
| Col1 | Col2 | NewID |
|---|---|---|
| A | X | 1 |
| A | Y | 2 |
| A | X | 1 |
| B | X | 1 |
| B | Z | 2 |
完全符合你的需求:同一Col1内不同Col2的ID从1递增,Col1切换后ID重置。
内容的提问来源于stack exchange,提问作者cyntha
相关产品推荐
相关产品推荐

