Pandas DataFrame字符串列匹配数字自增1的报错处理与功能实现
问题核心原因
你报错的本质是re.search匹配失败返回None时,直接执行[0]下标操作触发异常,不用手动写遍历判断,用Pandas原生的字符串处理方法更简洁,还能自动处理不匹配的空值。
最简实现方案
1. 依赖导入
import pandas as pd import re
2. 全流程逻辑代码
完全适配「仅部分行带#数字」的场景,不会触发None报错,且只会修改带#的行:
# 你的原始数据 data = {'ID': [1,2,3,4], 'Name': ['BN #1', 'HHC', 'A comp', 'B Comp']} df = pd.DataFrame(data) # 提取#后的数字,不匹配的自动返回NaN,无报错 df['SysNum'] = df['Name'].str.extract(r'(?<=#)(\d+)').astype(float) # 计算新编号:当前最大编号+1,无匹配时默认从1开始 max_num = df['SysNum'].max() new_num = int(max_num + 1) if pd.notna(max_num) else 1 # 复制生成新表 df_new = df.copy() # 仅修改带#的行的Name字段,其余行保持原样 mask = df_new['SysNum'].notna() df_new.loc[mask, 'Name'] = df_new.loc[mask, 'Name'].str.replace(r'(?<=#)\d+', str(new_num), regex=True) # 延续原表ID编号 df_new['ID'] = range(df['ID'].max() + 1, df['ID'].max() + 1 + len(df_new)) # 拼接新老表,删除辅助列 df_final = pd.concat([df, df_new], ignore_index=True).drop('SysNum', axis=1)
3. 输出结果验证
运行后df_final和你期望的结构完全一致:
| ID | Name |
|---|---|
| 1 | BN #1 |
| 2 | HHC |
| 3 | A comp |
| 4 | B Comp |
| 5 | BN #2 |
| 6 | HHC |
| 7 | A comp |
| 8 | B Comp |
原代码优化说明
- 用
str.extract代替手动正则循环,自动处理不匹配空值,完全避免None类型报错 - 布尔掩码
mask精准控制仅修改带#的行,其余行不会被强制追加数字后缀 - 自动兼容无任何#数字匹配的边界场景,默认从1开始编号
- 无需额外生成BaseName辅助列,逻辑更简洁
内容的提问来源于stack exchange,提问作者JakeP
相关产品推荐
相关产品推荐

