如何删除Pandas DataFrame中首次出现NaN后的所有行
通用解决方案
核心思路是先统一识别全表所有类型的NaN(包括np.nan和字符串形式的'NaN'),再定位全表首次出现NaN的行位置,最后切片保留该位置之前的所有行,全程不依赖列dtype:
import pandas as pd import numpy as np def truncate_after_first_nan(df): # 同时识别np.nan和字符串'NaN',生成全表空值掩码 mask = pd.isna(df) | (df.astype(str) == 'NaN') # 逐行判断是否存在任意空值 has_nan_row = mask.any(axis=1) # 找到第一个出现空值的行索引,无空值则返回原表 if has_nan_row.any(): first_nan_idx = has_nan_row.idxmax() return df.iloc[:first_nan_idx].copy() else: return df.copy()
测试验证
测试用例1(含字符串'NaN')
输入:
df1 = pd.DataFrame({"A": (1,2,3,4,5,6,7,'NaN','NaN','NaN','NaN'),"B": (1,2,3,'NaN',4,5,6,7,'NaN',"9","10"),"C": range(11)}) print(truncate_after_first_nan(df1))
输出与预期一致:
A B C 0 1 1 0 1 2 2 1 2 3 3 2
测试用例2(含np.nan)
输入:
df2 = pd.DataFrame({"A": (1,2,3,4,5,6,7,np.nan,np.nan,np.nan,np.nan),"B": (1,2,3,np.nan,4,5,6,7,np.nan,"9","10"),"C": range(11)}) print(truncate_after_first_nan(df2))
输出与预期一致:
A B C 0 1.0 1 0 1 2.0 2 1 2 3.0 3 2
方案说明
- 兼容所有列dtype:通过
astype(str)统一转换后判断字符串'NaN',配合pd.isna识别原生空值,不受int、float、object等类型限制 - 全表自动检测:无需指定单列,自动扫描所有列的空值
- 边界处理:如果全表没有任何NaN,会完整返回原表
内容的提问来源于stack exchange,提问作者Karn Kumar
相关产品推荐
相关产品推荐

