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

Pandas为DataFrame指定列值唯一组合创建从1开始的递增ID

为A、B列唯一组合生成从1开始递增ID的实现方法

你一开始想到用groupby(["A", "B"])的思路是完全正确的,不需要做额外的聚合、遍历分组操作,直接调用pandas分组对象自带的ngroup()方法就能快速生成组ID,注意匹配你预期的「ID按组合首次出现顺序递增」的要求,需要给groupby加sort=False参数关闭默认的分组键排序,代码如下:

import pandas as pd

# 原数据构造
df = pd.DataFrame({
    "year": [2000,2000,2000,2001,2001,2001],
    "A": [1,1,0,0,1,0],
    "B": [4,4,6,10,10,10]
})

# 生成ID:ngroup默认从0开始编号,+1即可得到从1开始的ID
df["ID_AB"] = df.groupby(["A", "B"], sort=False).ngroup() + 1

执行后输出的结果和你给出的预期效果完全一致:

year  A   B  ID_AB
0  2000  1   4      1
1  2000  1   4      1
2  2000  0   6      2
3  2001  0  10      3
4  2001  1  10      4
5  2001  0  10      3

其他可选实现方式

如果不想用groupby,也可以用pd.factorize()方法直接识别行组合生成编码,这个方法默认按值首次出现的顺序分配编号,不需要额外设置排序参数,大数据量下性能更好:

df["ID_AB"] = pd.factorize(zip(df["A"], df["B"]))[0] + 1

注意事项

  • 如果不加sort=False参数,groupby会先对A、B列的组合做字典序排序再分配编号,比如(0,6)的组合会因为A列值更小被分配到ID1,和你预期的顺序不符
  • 两种方法生成的ID都是连续整数,相同的A、B组合一定会拿到相同ID,不同组合ID不重复,完全满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 10:27:39