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
相关产品推荐
相关产品推荐

