如何在Pandas中基于列表值生成互斥子集并删除指定行
Pandas 行筛选与多列条件删除问题解答
一、基于列表值筛选/删除行,创建互斥DataFrame子集
要实现基于列表值的行筛选或删除,以及生成互斥子集,核心是利用Pandas的isin()方法:
- 筛选包含列表值的行:直接用
isin()匹配目标列的元素,返回符合条件的子集 - 删除包含列表值的行:对
isin()的结果取反(~),得到不包含目标值的行 - 生成互斥子集:将上述两个结果分别存储,两个子集无重叠且共同覆盖原DataFrame的所有行
示例代码:
import pandas as pd target_list = ["abc1", "def"] # 假设原DataFrame为df,以col1为匹配列 # 筛选包含目标值的行 subset_include = df[df['col1'].isin(target_list)] # 筛选不包含目标值的行(即删除包含目标值的行) subset_exclude = df[~df['col1'].isin(target_list)]
二、删除同时包含两个列表各至少一个元素的行(支持多列)
针对多列(100+列)的场景,我们需要判断每行是否同时存在list1和list2的元素,再过滤掉这类行:
- 遍历每行,检查是否有任意列包含
list1的元素 - 同理检查是否有任意列包含
list2的元素 - 保留不同时满足上述两个条件的行
结合你的示例实现:
import pandas as pd list1 = ["abc1", "def"] list2 = ["ghi", "ghj"] df = pd.DataFrame({ "index": [0,1,2,3,4,5,6,7,8], "col1": ["abc1", "ghj", "ghi", "abc1", "","def","ghj","abc1","abc1"], "col2": ["abc1", "abc1", "dfg", "dfg", "ghi","dfg","","ghj","abc1"], "col3": ["abc1", "qrst", "dfg", "dfg", "dfg","dfg","abc1","ghi","abc1"] }) # 判断每行是否包含list1的任意元素 has_list1 = df.apply(lambda row: any(val in list1 for val in row), axis=1) # 判断每行是否包含list2的任意元素 has_list2 = df.apply(lambda row: any(val in list2 for val in row), axis=1) # 过滤掉同时包含两个列表元素的行 filtered_df = df[~(has_list1 & has_list2)]
执行后filtered_df的结果为:
index col1 col2 col3 0 0 abc1 abc1 abc1 2 2 ghi dfg dfg 3 3 abc1 dfg dfg 4 4 ghi dfg 5 5 def dfg dfg 8 8 abc1 abc1 abc1
该方法通过apply(axis=1)遍历每行,自动适配任意数量的列,无需硬编码列名,适合处理100+列的数据集。
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

