You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何查找非空列数超阈值、指定列后有值的行

Pandas 高效筛选含空值DataFrame行的实现方案

所有方法均基于Pandas内置向量化运算实现,无Python层逐行循环,十万到百万行规模数据均可毫秒级完成处理,两类需求的实现逻辑如下:

  • 需求1:筛选非空值所在列数超过指定阈值的行
    核心逻辑是逐元素判断单元格是否非空,逐行统计非空值数量后做布尔索引筛选即可,以阈值20为例:

    # 统计每行非空值的列数
    non_null_col_count = df.notna().sum(axis=1)
    # 提取非空列数超过20的行
    rows_with_more_than_20_non_null = df[non_null_col_count > 20]
    # 若需要剔除这类行,直接对条件取反筛选
    # df_filtered = df[non_null_col_count <= 20]
    
  • 需求2:筛选指定iloc列位置之后存在非空值的行
    核心逻辑是先按位置切分出阈值之后的所有列,再逐行判断该范围内是否存在非空值,以你提到的「列索引=3之后(即从第4列开始到末尾)存在非空值就删除、仅保留前3列有值后续全空的行」为例:

    # 按iloc切出列索引3及之后的所有列,若阈值为20就把3改成20
    cols_after_threshold = df.iloc[:, 3:]
    # 判断每行在上述列范围内是否存在至少1个非空值
    has_non_null_in_tail = cols_after_threshold.notna().any(axis=1)
    # 取反筛选,保留尾部列全为空的行
    df_filtered = df[~has_non_null_in_tail]
    

你可以用自己提到的5列小规模样例做验证,测试代码如下:

import pandas as pd
import numpy as np

# 构造对应场景的测试数据
df = pd.DataFrame({
    'ID': ['01','02','03','04','05','06','07'],
    'Col.00': [1,2,3,4,5,6,7],
    'Col.01': [1,2,3,4,5,6,7],
    'Col.02': [1,2,3,np.nan,5,6,7],
    'Col.03': [np.nan,np.nan,1,1,np.nan,np.nan,np.nan],
    'Col.04': [1,np.nan,1,np.nan,np.nan,np.nan,1]
})

# 执行筛选
cols_after = df.iloc[:, 3:]
has_non_null = cols_after.notna().any(axis=1)
result = df[~has_non_null]

运行后result对应的ID为02、05、06,和你的预期结果完全一致。

如果需要同时满足两个筛选条件,直接用&合并两个判断条件即可:

# 组合条件:每行非空列数不超过20 且 列索引3之后全为空
cond1 = df.notna().sum(axis=1) <= 20
cond2 = ~df.iloc[:, 3:].notna().any(axis=1)
df_final = df[cond1 & cond2]

内容的提问来源于stack exchange,提问作者SHAH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 21:27:47