如何在Pandas中筛选包含指定值的行并生成新DataFrame?
筛选同时包含指定值的行(Pandas)
嘿,针对你需要筛选同时包含8和25的行(不管这俩值出现在哪一列)的需求,我整理了两种实用方法,都能轻松搞定你的数千行数据集:
方法一:高效集合检查(推荐)
这种方法用集合判断子集的方式,效率更高,还能自动避开非数值列(比如你的id列):
import pandas as pd # 定义要找的两个目标值 targets = {8, 25} # 先筛选出所有数值类型的列(避免检查id这类字符串列) numeric_cols = df.select_dtypes(include=['number']).columns # 生成布尔掩码:每行检查是否同时包含两个目标值 mask = df[numeric_cols].apply(lambda row: targets.issubset(row.values), axis=1) # 生成新DataFrame,用copy()避免后续的警告问题 filtered_df = df[mask].copy()
为啥推荐这个?
- 集合的
issubset判断比两次单独检查更快,尤其数据量大的时候 select_dtypes自动过滤非数值列,不用手动列出来,更灵活- 最后用
.copy()是为了防止后续修改时触发SettingWithCopyWarning,养成好习惯
方法二:直观逐值检查(适合理解逻辑)
如果你想更直白地写出判断逻辑,也可以分开检查每个值是否存在,再取逻辑与:
# 分别检查每行是否包含8和25,然后取两者的交集 has_8 = df.apply(lambda row: 8 in row.values, axis=1) has_25 = df.apply(lambda row: 25 in row.values, axis=1) mask = has_8 & has_25 filtered_df = df[mask].copy()
针对你的示例数据的结果
运行后,filtered_df会包含行a和c:
id num1 num2 num3 num4 num5 num6
a 43 25 37 8 36 20
c 43 25 23 38 1 8
小提示
- 如果你的数据里有缺失值(NaN),不用担心,
in或者issubset会自动忽略NaN,不会影响判断 - 要是你想检查所有列(包括非数值列),直接把
df[numeric_cols]改成df就行
内容的提问来源于stack exchange,提问作者West
相关产品推荐
相关产品推荐

