You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas筛选同时含pie和非pie项的DataFrame行?

解决Pandas筛选同时包含特定元素和非特定元素行的问题

问题场景

你有一个Pandas DataFrame,其中set列每行包含两个条目,需要筛选出set列中同时存在带'pie'的项和不带'pie'的项的行(示例中仅ID为1的行符合要求)。

示例数据

先构造符合场景的测试数据:

import pandas as pd

data = {
    'ID': [1, 2, 3],
    'set': [['apple pie', 'banana'], ['cherry pie', 'blueberry pie'], ['orange', 'grape']]
}
df = pd.DataFrame(data)

原代码失效原因

你之前写的代码:

df[(any("pie" in s for s in df['set'])) & (any("pie" not in s for s in df['set']))]

问题在于any()是对整个df['set']列进行判断,返回的是单个布尔值(比如整个列是否存在含'pie'的元素),而非每行对应的布尔值,因此无法实现逐行筛选。

正确实现方法

方法一:使用apply逐行判断(简洁直观)

通过apply对每行的set列元素进行检查,判断是否同时满足两个条件:

# 构造逐行判断的掩码
mask = df['set'].apply(lambda x: any('pie' in item for item in x) and any('pie' not in item for item in x))
# 筛选符合条件的行
result = df[mask]

运行后result仅保留ID为1的行,符合需求。

方法二:向量化处理(适合大数据集)

如果数据集较大,apply效率偏低,可以将set列拆分为单独列后,用向量化操作判断:

# 将set列的两个元素拆分为单独列
df[['item1', 'item2']] = pd.DataFrame(df['set'].tolist(), index=df.index)

# 构造条件:一个元素含'pie',另一个不含
mask = ((df['item1'].str.contains('pie')) & (~df['item2'].str.contains('pie'))) | \
       ((~df['item1'].str.contains('pie')) & (df['item2'].str.contains('pie')))

# 筛选后删除临时列
result = df[mask].drop(['item1', 'item2'], axis=1)

内容的提问来源于stack exchange,提问作者SJPJack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:35:21