Pandas如何按B/C/D列分组为同组DataFrame行分配整数编号新增列
pandas 多列分组生成连续组编号列实现
需求说明
对包含A、B、C、D四列的DataFrame新增Val列,规则如下:
- B、C、D三列取值完全相同的行归为同一组
- 每组分配从1起始的连续整数标识,同组所有行的
Val取值一致 - 最终结果保留原有全部列,仅新增
Val列 - 样例预期:B=X、C=10、D=1a的两行(行1、行4)同组,Val均为1;行2单独成组Val为2;行3单独成组Val为3
实现代码
直接调用pandas内置的groupby().ngroup()方法即可,该方法会按分组首次出现的顺序返回连续整数组编号,默认从0开始计数,要实现从1开始编号直接对结果加1即可:
import pandas as pd # 构造样例测试数据 df = pd.DataFrame({ 'A': ['AB', 'FH', 'KY', 'DA'], 'B': ['X', 'Y', 'Z', 'X'], 'C': [10, 15, 20, 10], 'D': ['1a', '4h', '6f', '1a'] }) # 生成符合要求的Val列 df['Val'] = df.groupby(['B', 'C', 'D'], sort=False).ngroup() + 1
传入
sort=False参数是为了严格按分组在原表中首次出现的顺序分配编号,避免pandas自动对分组键排序打乱编号顺序,和样例预期完全匹配。
运行结果
执行代码后输出的DataFrame如下,完全符合要求:
A B C D Val 0 AB X 10 1a 1 1 FH Y 15 4h 2 2 KY Z 20 6f 3 3 DA X 10 1a 1
注意事项
- 如果需要编号从0起始,直接去掉代码末尾的
+ 1即可 - 该方法生成的编号是连续无跳号的整数,性能远高于手动映射字典的实现,百万级数据量也能快速处理
- 如果需要自定义组号顺序,可以提前对指定列排序后再执行分组逻辑
内容的提问来源于stack exchange,提问作者HK1
相关产品推荐
相关产品推荐

