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

如何删除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:21:04