如何通过循环移除DataFrame值的null-前缀仅保留数字
问题描述
- 现有Pandas DataFrame中部分字段值带有固定前缀
null-,需要移除该前缀,仅保留前缀后的数字内容。 - DataFrame样例结构:

- 自行编写循环逻辑实现该需求时触发运行报错,报错情况如下:

实现方案
Pandas本身提供了向量化的字符串处理接口,不需要手写循环逐元素修改,既可以避免类型类报错,处理效率也远高于手写循环。
全表统一处理(所有列都需要移除前缀时使用)
直接对全表应用字符串替换规则,正则^null-只匹配字符串开头的null-前缀,不会误替换字符串其他位置出现的相同内容:
df = df.apply(lambda col: col.str.replace(r'^null-', '', regex=True))
指定列处理(仅部分列需要移除前缀时使用)
把需要处理的列名放到列表中,仅对目标列做替换即可:
# 替换成你实际需要处理的列名 target_columns = ['列名1', '列名2', '列名3'] df[target_columns] = df[target_columns].apply(lambda col: col.str.replace(r'^null-', '', regex=True))
报错原因说明
手写循环触发报错的核心原因是:遍历单元格时没有做类型校验,遇到非字符串类型的值(比如空值、数值类型值)时直接调用字符串方法,就会抛出类型错误。上述向量化方案会自动跳过非字符串值、空值,不会触发这类报错。
如果一定要用手写循环实现(性能远低于向量化方案,不推荐),需要先判断值类型再做处理:
for col in df.columns: for idx in df.index: cell_val = df.loc[idx, col] # 仅对字符串类型、且带指定前缀的值做处理 if isinstance(cell_val, str) and cell_val.startswith('null-'): df.loc[idx, col] = cell_val[5:] # "null-"长度为5,直接截取后面的内容即可
内容的提问来源于stack exchange,提问作者Taiguara Cavaliere
相关产品推荐
相关产品推荐

