如何在Pandas DataFrame中复制列并按分组添加三位递增序号?
Pandas按前缀分组添加递增序号后缀生成新列
原始数据
import pandas as pd df = pd.DataFrame({ 'Column A': [ 'LineName-1', 'LineName-2', 'LineName-3', 'BlockName-1', 'BlockName-2', 'BlockName-3' ] })
需求说明
复制Column A生成新列Column B:给以LineName开头的行添加从001开始的递增序号后缀;以BlockName开头的行则重新从001开始递增添加后缀,最终效果如下:
期望输出
Column A Column B 0 LineName-1 LineName-1_001 1 LineName-2 LineName-2_002 2 LineName-3 LineName-3_003 3 BlockName-1 BlockName-1_001 4 BlockName-2 BlockName-2_002 5 BlockName-3 BlockName-3_003
解决方案
核心思路是按前缀分组,给每组内的行生成连续的三位序号,再拼接成目标列。
简洁实现代码
# 直接生成Column B,无需中间列 df['Column B'] = df['Column A'] + '_' + ( df.groupby(df['Column A'].str.split('-').str[0]) .cumcount() + 1 ).apply(lambda num: f'{num:03d}')
分步解释
- 提取分组前缀:
df['Column A'].str.split('-').str[0]将每行字符串按-分割,取第一部分作为分组标识(LineName/BlockName)。 - 生成组内序号:
groupby(...).cumcount() + 1对每个分组内的行从1开始计数,得到递增序号。 - 格式化序号:
f'{num:03d}'将序号格式化为带前导零的三位字符串,确保统一格式。 - 拼接生成新列:把原列内容和格式化后的序号用
_拼接,得到Column B。
扩展说明
如果前缀的分隔符不是-,比如是下划线或其他符号,只需要调整str.split的参数即可。例如前缀是LineName_1,就改成str.split('_').str[0]。
内容的提问来源于stack exchange,提问作者Ebrahiem
相关产品推荐
相关产品推荐

