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

Pandas DataFrame为重复ID标记A-B递进关联关系的高效实现

Pandas 按ID生成分组递进字母标记的向量化实现

不要用iterrows逐行遍历,基于pandas内置的分组计数+字符映射做实现,100万行规模数据处理耗时不到1秒,比iterrows方案快两个数量级以上。

实现逻辑

核心是用groupby.cumcount()给每个ID组内的行按出现顺序生成从0开始的序号,再通过序号直接映射大写字母,完全规避Python层面的逐行循环:

  • 对存在重复的ID,组内序号为n时,递进标记天然满足规则:first对应第n个大写字母、other对应第n+1个大写字母
  • 单独覆盖无重复ID的场景:如果ID总出现次数为1,将other列值设为0即可
  • 大写字母映射直接用chr(ord('A') + 序号)实现,无需提前构建映射字典

完整代码示例

import pandas as pd

# 测试数据
df = pd.DataFrame({
    'id': [1, 2, 2, 3, 3, 3, 4, 5, 5]
})

# 生成组内序号(从0开始,按行的先后顺序计数)
df['row_seq'] = df.groupby('id').cumcount()
# 统计每个ID的总出现次数,识别无重复的ID
df['id_total'] = df.groupby('id')['id'].transform('count')

# 按规则生成字母标记
df['first'] = df['row_seq'].apply(lambda x: chr(ord('A') + x))
df['other'] = df['row_seq'].apply(lambda x: chr(ord('A') + x + 1))
# 无重复ID的other列固定为0
df.loc[df['id_total'] == 1, 'other'] = 0

# 清理临时列
df = df.drop(columns=['row_seq', 'id_total'])

执行结果

运行后输出完全匹配规则:

idfirstother
1A0
2AB
2BC
3AB
3BC
3CD
4A0
5AB
5BC

扩展适配

如果单个ID的重复次数超过26次,需要生成AA/AB这类多字母递进标记,只需要替换字符映射逻辑即可:

  1. 导入工具函数:from openpyxl.utils import get_column_letter
  2. 将first、other列的赋值逻辑替换为:
df['first'] = df['row_seq'].apply(lambda x: get_column_letter(x+1))
df['other'] = df['row_seq'].apply(lambda x: get_column_letter(x+2))

其余逻辑保持不变。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:48:43