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

