Pandas用循环、条件判断使用slice_replace修改列字符串的实现问题
报错原因
你写的代码触发报错的核心有两个:
- 直接遍历
df['INPUT']得到的循环变量i是原生Python字符串对象,不是Pandas的Series类型,而.str.slice_replace是Pandas Series专属的字符串访问器方法,原生字符串没有这个属性,自然会抛出AttributeError。 - 即便修正了访问器的问题,循环里对临时变量
i的赋值也不会同步改动原DataFrame的列值,因为遍历拿到的只是值的临时拷贝,没有指向原数据的索引关联。
可运行的修正方案
方案1:适配你原有思路的遍历实现
遍历列值时通过items()同时拿到行索引和对应值,匹配条件后直接用Python原生字符串切片完成替换,再通过索引把值写回原DataFrame:
import pandas as pd data = {'INPUT':['AB-TEF', 'AB0HFD', 'AB0GRD','AB0JEC','AB-JOD']} df = pd.DataFrame(data) for idx, val in df['INPUT'].items(): if val.startswith('AB0'): # 原生字符串切片:保留前2位、拼接替换符、保留第4位及之后的内容 df.loc[idx, 'INPUT'] = f"{val[:2]}-{val[3:]}"
方案2:Pandas推荐的向量化实现
不需要写手动循环,直接通过Pandas的字符串访问器完成条件筛选和批量替换,数据量大时性能远高于逐行遍历:
# 生成匹配条件的掩码 match_mask = df['INPUT'].str.startswith('AB0') # 对匹配的行直接调用slice_replace完成替换 df.loc[match_mask, 'INPUT'] = df.loc[match_mask, 'INPUT'].str.slice_replace(start=2, stop=3, repl='-')
运行结果
两种方法运行后得到的DataFrame完全符合预期:
INPUT 0 AB-TEF 1 AB-HFD 2 AB-GRD 3 AB-JEC 4 AB-JOD
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

