如何在Python的DataFrame中按条件清除单列单元格内容而非删整行
Pandas中清空包含指定字符的单元格内容
问题描述
给定如下DataFrame,需要将var1列中包含字母Z的单元格内容清空,但保留整行数据:
import pandas as pd df = pd.DataFrame({"var1": ["AZZBBAA", "CCDDDED", "DZZZZFD", "CDEEEEFG"], "var2": [1,2,4,5]})
期望输出:
var1 var2 0 1 1 CCDDDED 2 2 4 3 CDEEEEFG 5
解决方案
方法1:.loc条件赋值(最直观)
通过布尔索引定位符合条件的行,直接将对应单元格设为空字符串:
# 定位var1列中包含'Z'的行,将var1单元格置空 df.loc[df['var1'].str.contains('Z'), 'var1'] = ''
原理:
df['var1'].str.contains('Z')返回一个布尔Series,标记每个单元格是否包含Z.loc[布尔条件, 列名]精准定位需要修改的单元格,赋值为空字符串即可
方法2:使用str.replace结合正则(满足你最初的思路)
如果你想用str.replace实现,可以通过正则匹配整个包含Z的字符串,替换为空:
# 正则匹配任意包含Z的字符串,替换为空 df['var1'] = df['var1'].str.replace(r'.*Z.*', '', regex=True)
注意:
- Pandas 2.0及以上版本默认关闭正则匹配,所以必须显式设置
regex=True - 正则
.*Z.*表示匹配任意包含Z的完整字符串(.*匹配任意字符任意次数)
方法3:mask函数(Pandas风格的简洁写法)
利用mask函数,当条件为真时替换目标值:
# 当var1包含Z时,替换为空字符串,否则保留原值 df['var1'] = df['var1'].mask(df['var1'].str.contains('Z'), '')
内容的提问来源于stack exchange,提问作者thole
相关产品推荐
相关产品推荐

