如何筛选包含指定列表所有值的Pandas DataFrame行
Pandas筛选包含指定列表所有值的行
问题描述
现有如下DataFrame:
C1 C2 C3 C4 1 A B C E 2 C D E F 3 A C A B 4 A A B G 5 B nan C E
以及筛选列表 filt = ['A', 'B', 'C'],需要筛选出包含该列表全部值的行(值的顺序、位置不限,允许存在其他值),期望输出:
C1 C2 C3 C4 1 A B C E 3 A C A B
解决方案
方法1:集合子集判断法
通过apply遍历每行,先剔除空值再转为集合,判断筛选列表的集合是否是该行集合的子集:
import pandas as pd # 构造原始DataFrame df = pd.DataFrame( data=[ ['A', 'B', 'C', 'E'], ['C', 'D', 'E', 'F'], ['A', 'C', 'A', 'B'], ['A', 'A', 'B', 'G'], ['B', pd.NA, 'C', 'E'] ], columns=['C1', 'C2', 'C3', 'C4'], index=[1, 2, 3, 4, 5] ) filt = ['A', 'B', 'C'] # 生成筛选掩码:检查筛选列表的所有元素是否都在该行非空值中 mask = df.apply(lambda row: set(filt).issubset(row.dropna()), axis=1) # 应用掩码得到结果 result_df = df[mask] print(result_df)
方法2:逐个元素校验法
对筛选列表中的每个元素,逐一检查该行是否包含该元素,最终保留所有元素都满足的行:
# 生成筛选掩码:每行必须包含filt中的每一个元素 mask = df.apply(lambda row: all(val in row.values for val in filt), axis=1) result_df = df[mask] print(result_df)
两种方法均可得到期望输出:方法1自动忽略空值,适配含缺失值的场景;方法2逻辑更直白,适合快速理解筛选逻辑。
内容的提问来源于stack exchange,提问作者steliosbl
相关产品推荐
相关产品推荐

