如何用正则表达式删除Pandas DataFrame中符合规则的行
Pandas按标签与内容位置过滤行
问题背景
现有如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame( { 'a': [ '#x{LA 0.098:abc}', '#x{LA abc:0.31}', '#x{BC abc:0.1231}', '#x{LA 0.333:abc}', '#x{CN 0.031:abc}', '#x{YM abc:12345}', '#x{YM 1222:abc}', ] } )
同时有两个标签规则列表:
labels_that_abc_is_right = ['LA', 'CN'] labels_that_abc_is_left = ['YM', 'BC']
需求
- 删除包含
labels_that_abc_is_right中标签且**"abc"在冒号右侧**的行 - 删除包含
labels_that_abc_is_left中标签且**"abc"在冒号左侧**的行
期望输出
a 1 #x{LA abc:0.31} 6 #x{YM 1222:abc}
解决方案
方法一:正则匹配直接筛选(简洁版)
直接构造匹配需要删除的行的正则表达式,通过取反保留符合要求的行:
# 构造匹配待删除行的正则:两种违规情况用|分隔 drop_pattern = fr'#x\{{({"|".join(labels_that_abc_is_right)}) [^:]+:abc\}}|#x\{{({"|".join(labels_that_abc_is_left)}) abc:[^}]+\}}' # 取反筛选,保留非违规行 filtered_df = df[~df['a'].str.contains(drop_pattern)]
正则逻辑说明
- 第一部分:匹配
labels_that_abc_is_right中的标签(如LA/CN),后续是任意非冒号内容,最后以:abc}结尾的行(即abc在冒号右侧的违规行) - 第二部分:匹配
labels_that_abc_is_left中的标签(如YM/BC),后续是abc:,最后接任意非}内容的行(即abc在冒号左侧的违规行) - 用
~对匹配结果取反,保留不需要删除的行
方法二:提取字段后筛选(易读版)
如果需要更清晰的逻辑,可以先提取每行的标签、冒号左右内容,再通过布尔条件筛选:
# 正则捕获标签、冒号左侧内容、冒号右侧内容 pattern = r'#x\{([A-Z]+) ([^:]+):([^}]+)\}' matches = df['a'].str.extract(pattern) matches.columns = ['label', 'left_content', 'right_content'] # 合并提取结果到原DataFrame df_with_details = pd.concat([df, matches], axis=1) # 构造筛选条件:排除两种违规情况 cond1 = ~((df_with_details['label'].isin(labels_that_abc_is_right)) & (df_with_details['right_content'] == 'abc')) cond2 = ~((df_with_details['label'].isin(labels_that_abc_is_left)) & (df_with_details['left_content'] == 'abc')) # 应用条件并清理临时列 filtered_df = df_with_details[cond1 & cond2].drop(columns=['label', 'left_content', 'right_content'])
两种方法执行后,都能得到期望的输出结果。
内容的提问来源于stack exchange,提问作者AmirX
相关产品推荐
相关产品推荐

