如何从DataFrame中筛选第二个‘-’后含特定字符的行?
筛选第二个'-'后包含特定字符的DataFrame行
嘿,这个需求很典型,我给你分享几个简单又靠谱的实现思路,直接就能用:
方法1:拆分字符串后检查目标部分
先通过str.split把字符串按-拆分,只拆前两个分隔符(n=2),这样就能精准拿到第二个-之后的内容,再用str.contains判断是否包含目标字符(比如'E')。
示例代码:
import pandas as pd # 假设你的DataFrame列名为'target_col' filtered_df = df[df['target_col'].str.split('-', n=2).str[2].str.contains('E')]
- 解释:
str.split('-', n=2)会把字符串分成3部分(索引0、1、2),str[2]就是第二个-之后的所有内容;如果某行不足两个-,这部分会返回NaN,str.contains会自动忽略这些行,刚好符合我们的筛选逻辑。
方法2:用正则表达式直接匹配
如果数据量比较大,正则表达式的效率会更高,直接匹配“两个-之后包含E”的模式:
示例代码:
filtered_df = df[df['target_col'].str.contains(r'^[^-]+-[^-]+-.*E.*')]
- 正则说明:
^[^-]+-:匹配开头到第一个-的内容([^-]+表示任意非-的字符)[^-]+-:匹配第一个-到第二个-的内容.*E.*:匹配第二个-之后包含'E'的任意内容
额外技巧:忽略大小写匹配
如果需要不区分大小写(比如同时匹配'E'和'e'),只需要给str.contains加个参数:
# 方法1的写法 filtered_df = df[df['target_col'].str.split('-', n=2).str[2].str.contains('E', case=False)] # 方法2的写法(正则里加忽略大小写标记) filtered_df = df[df['target_col'].str.contains(r'^[^-]+-[^-]+-.*E.*', case=False)]
举个实际例子验证:
假设你的DataFrame是这样的:
data = {'target_col': ['A-B-C', 'X-Y-E', 'P-Q-R-e', 'L-M', 'S-T-U-V-E']} df = pd.DataFrame(data)
用上面的方法筛选后,会得到包含X-Y-E、P-Q-R-e、S-T-U-V-E的行,完全符合需求。
内容的提问来源于stack exchange,提问作者user9118870
相关产品推荐
相关产品推荐

