如何用一行代码筛选DataFrame:保留指定开头Position且排除特定值
问题场景
现有如下DataFrame:
import pandas as pd df = pd.DataFrame([['Jim', 'CF'], ['Toby', 'RW'], ['Joe', 'RWF'], ['Tom', 'RAMF'], ['John', 'RWB']], columns=['Name', 'Position'])
需要筛选出仅包含Position为'RW'、'RWF'或'RAMF'的行,要求用一行代码实现。
原实现用了两行代码:
RW = df[df['Position'].str.startswith(('RW', 'RAMF', 'RWF'), na = False)] RW = RW[RW['Position'].str.contains('RWB')==False]
问题在于用str.startswith('RW')会误包含'RWB',因此需要第二行排除该值,现在要合并为一行代码。
解决方案
这里提供几种简洁的一行代码实现方式:
方法1:精确匹配(最推荐)
直接指定要保留的Position值列表,精确匹配完全不会出现误判:
RW = df[df['Position'].isin(['RW', 'RWF', 'RAMF'])]
方法2:合并原筛选条件
把原两行的筛选逻辑用逻辑与(&)拼接,注意每个条件要单独加括号:
RW = df[(df['Position'].str.startswith(('RW', 'RAMF', 'RWF'), na=False)) & (df['Position'] != 'RWB')]
方法3:正则精准匹配
用正则表达式限定字符串结尾,避免匹配到RWB这类相似值:
RW = df[df['Position'].str.match(r'^(RW$|RWF$|RAMF$)', na=False)]
正则里的$表示匹配到字符串末尾,确保只有完全符合的目标值会被选中。
内容的提问来源于stack exchange,提问作者codemachine98
相关产品推荐
相关产品推荐

