You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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开始的ID
  • transform保证结果和原DataFrame的索引对齐

示例验证

假设你的数据如下:

Col1Col2
AX
AY
AX
BX
BZ

运行方法1后,NewID列结果为:

Col1Col2NewID
AX1
AY2
AX1
BX1
BZ2

完全符合你的需求:同一Col1内不同Col2的ID从1递增,Col1切换后ID重置。

内容的提问来源于stack exchange,提问作者cyntha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 13:20:30