如何删除指定列中缺失值达阈值的DataFrame行?
解决方案:灵活删除指定列中NaN数量超阈值的行
原始数据与需求
给定如下DataFrame:
import pandas as pd import numpy as np d = {'name': ['bob', 'jake','Sem'], 'F1': [3, 4, np.nan], 'F2': [14, 40, 7], 'F3': [np.nan, 1, 55]} df = pd.DataFrame(data=d)
输出:
name F1 F2 F3 0 bob 3.0 14 NaN 1 jake 4.0 40 1.0 2 Sem NaN 7 55.0
需求:删除F开头的所有列(可扩展至F100)中至少有2个NaN的行,最终保留前两行。
最优实现方式
核心思路是通过灵活选列+统计每行NaN数量+布尔过滤,完全满足可调整列范围和阈值的需求:
步骤1:灵活指定要检查的列
如果目标列都是以F开头(如F1、F2...F100),用filter(like='F')可以自动匹配所有符合前缀的列,不用手动列全:
# 选中所有F开头的列 target_cols = df.filter(like='F').columns
如果需要指定具体列范围(比如F5到F20),也可以用列名列表:
# 示例:指定F1到F3的列 target_cols = ['F1', 'F2', 'F3']
步骤2:统计每行的NaN数量
用isna()标记NaN,再按行求和得到每行的NaN个数:
# 计算每行在目标列中的NaN数量 nan_count = df[target_cols].isna().sum(axis=1)
步骤3:设置阈值并过滤行
设置允许的最大NaN数量阈值(这里是2,即保留NaN数量<2的行),然后通过布尔索引筛选:
# 设置阈值:最多允许1个NaN(即删除>=2个NaN的行) threshold = 2 filtered_df = df[nan_count < threshold]
完整代码
import pandas as pd import numpy as np # 原始数据 d = {'name': ['bob', 'jake','Sem'], 'F1': [3, 4, np.nan], 'F2': [14, 40, 7], 'F3': [np.nan, 1, 55]} df = pd.DataFrame(data=d) # 1. 灵活选择目标列(F开头的所有列) target_cols = df.filter(like='F').columns # 2. 统计每行NaN数量 nan_count = df[target_cols].isna().sum(axis=1) # 3. 设置阈值并过滤 threshold = 2 filtered_df = df[nan_count < threshold] print(filtered_df)
输出结果:
name F1 F2 F3 0 bob 3.0 14 NaN 1 jake 4.0 40 1.0
优势说明
- 列范围灵活:通过
filter(like='F')自动匹配所有F前缀列,新增F4-F100时无需修改代码;也可手动指定列列表适配特殊需求。 - 阈值可调:只需修改
threshold变量,即可控制删除NaN数量的阈值(比如改成3,就删除至少3个NaN的行)。 - 高效简洁:利用pandas原生向量操作,比循环遍历行效率高得多,适合处理大数据量。
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

