You need to enable JavaScript to run this app. Pandas DataFrame按ID和ABCD_ID条件修改STATUS列值的优化方案
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame按ID和ABCD_ID条件修改STATUS列值的优化方案

最简实现方案

完全不需要手动逐行遍历,使用pandas内置的分组转换函数即可高效完成处理,且完全匹配预期输出效果。核心实现逻辑:

  • 以ID为大分组边界,切换到新ID时组号自动从1开始重新计数
  • 同一ID内部,每遇到一个新的ABCD_ID,组号依次递增1
  • 给同组所有行的STATUS列拼接统一的DOC_前缀

实现代码

# 按ID分组,组内对ABCD_ID做唯一值编码,生成从1开始的连续组号
df['group_no'] = df.groupby('ID')['ABCD_ID'].transform(lambda s: s.factorize()[0] + 1)
# 拼接STATUS列的前缀
df['STATUS'] = 'DOC_' + df['group_no'].astype(str) + '_' + df['STATUS']
# 清理临时生成的组号列
df = df.drop(columns='group_no')

原循环逻辑的问题说明

  • 全局维护的计数器变量a没有在ID切换时正确重置,也没有在同ID下遇到新ABCD_ID的场景正确递增,导致同ID下第二个ABCD_ID的行被错误绑定上一组的编号
  • 循环赋值时重复对已经拼接过前缀的行做二次拼接,最终出现DOC_1_DOC_2_APPROVAL_A这类重复前缀的错误
  • 逐行遍历的性能在十万行以上的大表场景下,会比向量化分组操作慢几个数量级

运行后输出效果

和预期结果完全一致:

ID  ABCD_ID                 STATUS
0  83590   IX1655        DOC_1_APPROVAL_A
1  83590   IX1655  DOC_1_FINAL-APPROVAL_A
2  82042   IX1656        DOC_1_APPROVAL_A
3  82042   IX1656    DOC_1_FINAL-APPROVAL
4  77848   IX1666        DOC_1_APPROVAL_M
5  77848   IX1666  DOC_1_FINAL-APPROVAL_A
6  77848   IX1667        DOC_2_APPROVAL_A
7  77848   IX1667  DOC_2_FINAL-APPROVAL_A

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 07:54:05