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
相关产品推荐
相关产品推荐

