如何用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
相关产品推荐
相关产品推荐

