df.replace() 默认返回新 dataframe 而不修改原数据,是函数式设计;需显式赋值或设 inplace=true;字符串列子串替换必须用 .str.replace(),因 replace() 按整值匹配;列名正则筛选用 filter(regex=...),行内容匹配用 str.contains() 或 str.replace(..., regex=true)。

replace() 默认不改原数据,str.replace() 才专用于字符串列的子串替换;正则过滤列名用 filter(regex=...),过滤行内容用 str.contains() 或 str.replace(..., regex=True)。
为什么直接 df.replace('old', 'new') 没反应?
因为 replace() 默认返回新 DataFrame,原 df 不变。这不是 bug,是设计——它鼓励函数式写法,避免隐式副作用。
- 要修改原数据:显式赋值
df = df.replace('old', 'new')(推荐)或加inplace=True(但注意它返回None,无法链式调用) - 只换某列?别用全局
replace(),改用df['col'] = df['col'].replace(...)或更精准的df['col'].str.replace(...) - 想换整个 DataFrame 里所有出现的
'N/A'?用df.replace('N/A', np.nan);但 NaN 本身不能被replace()捕获,必须用fillna()
字符串列部分替换该用 str.replace 还是 replace?
必须用 str.replace()。例如把 'ID_001' 中的前缀删掉:df['id'].str.replace('ID_', '')。这里 replace() 会报错或静默失败,因为它按“整值匹配”工作,而字符串列里存的是对象,不是纯字符串。
-
str.replace()支持regex=True,可传正则模式,如df['text'].str.replace(r'\s+', ' ', regex=True)压缩多余空格 - 它不支持
inplace参数,所以必须赋值:df['text'] = df['text'].str.replace(...) - 若需保留原始值中未匹配部分(比如只替换单词边界内的 ID),记得用
r'\b123\b'+re.escape()防元字符干扰
怎么按列名模式筛选列,而不是按内容?
用 filter(regex=...),不是 str.contains()。后者查的是单元格内容,前者查的是列名标签本身。
- 选所有以
'event'开头的列:df.filter(regex='^event', axis=1) - 选列名含数字且以
'd'结尾的:df.filter(regex=r'\d+d$', axis=1) - 注意
items、like、regex三者互斥,不能同时传;axis=1表示操作列,axis=0才操作行索引 - 它不碰数据,只返回子集 DataFrame —— 想基于这些列的内容做判断(比如“任一 event 列 > 0”),得接
.any(axis=1)
正则匹配行内容时,常见踩坑点有哪些?
str.contains() 和 str.replace(..., regex=True) 都默认开启正则,但元字符不转义就会出事——比如想删掉 '[err]',写成 .str.replace('[err]', '') 实际删的是字符组 '[e','r','r']',不是字面字符串。
- 安全做法:对动态 pattern 用
re.escape()包裹,尤其当替换值来自变量或外部映射表时 - 大小写敏感?默认
case=True,忽略大小写加case=False - 遇到 NaN?
str.contains()默认返回NaN,可用na=False统一设为False;str.replace()默认跳过 NaN,不影响其余值 - 性能提示:正则比纯字符串替换慢 3–5 倍,确定只需字面替换时,别多写
regex=True
真正容易被忽略的是:filter() 和 str.xxx() 完全不同世界——一个筛标签,一个处理内容;混用会导致查不到列或报 AttributeError。动手前先问一句:我要动的是列名,还是列里的字符串?
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











