如何查找DataFrame中含NaN的行,并删除这些行及其下方指定数量的行?
解决方案
核心思路是先定位全NaN行的位置,再将这些行及其下方指定数量的行统一标记为待删除,最后过滤即可,以下是可直接运行的实现代码:
方法1:布尔索引(推荐,代码更简洁)
无需手动处理索引越界问题,适配任意索引类型的DataFrame:
import pandas as pd import numpy as np # 配置参数:删除NaN行下方的行数 delete_below = 2 # 标记所有全NaN行 is_all_nan = df.isna().all(axis=1) # 向下扩展标记范围,覆盖要删除的后续行 for i in range(1, delete_below + 1): is_all_nan = is_all_nan | is_all_nan.shift(fill_value=False) # 取反得到要保留的行,重置索引可选 df_clean = df[~is_all_nan].reset_index(drop=True)
方法2:索引枚举
适合需要灵活调整删除逻辑的场景:
import pandas as pd import numpy as np delete_below = 2 # 定位所有全NaN行的索引 nan_row_indexes = df[df.isna().all(axis=1)].index drop_indexes = set() max_row = len(df) for idx in nan_row_indexes: # 加入当前NaN行,以及后续delete_below行 for offset in range(delete_below + 1): current_idx = idx + offset if current_idx < max_row: drop_indexes.add(current_idx) # 删除指定行,重置索引可选 df_clean = df.drop(drop_indexes).reset_index(drop=True)
效果说明
两种方法都自动处理了重复删除的场景:如果两个全NaN行距离很近、删除范围重叠,也不会出现逻辑错误,最终输出的DataFrame会完全过滤掉所有全NaN行及其下方指定数量的非NaN行。
内容的提问来源于stack exchange,提问作者dinn_
相关产品推荐
相关产品推荐

