如何仅删除Pandas DataFrame列中间非首尾的NaN行?
Pandas保留首尾连续NaN、删除中间零散NaN行的解决方案
核心思路
要实现目标,关键是区分两类NaN区域:
- 首尾连续NaN:位于第一个非NaN值之前,或最后一个非NaN值之后的所有NaN行,这类需要保留
- 中间零散NaN:夹在两个非NaN值之间的NaN行,这类需要删除
代码实现
import pandas as pd import numpy as np # 原始DataFrame df = pd.DataFrame({'A': [np.nan, np.nan, np.nan, np.nan, 45, 1, np.nan, 2, np.nan, 3, np.nan, 6, np.nan, np.nan, 8, 9, 15, np.nan, 18, np.nan, np.nan, np.nan, np.nan], 'B': [22,33,44,55,66,22,11,34,55,67,55,66,22,11,34,33,44,55,6,96,64,93,81]}) # 获取列A中第一个和最后一个非NaN值的索引 first_valid = df['A'].first_valid_index() last_valid = df['A'].last_valid_index() # 构造过滤掩码:保留首尾区域,或中间区域非NaN的行 filter_mask = (df.index <= first_valid) | (df.index >= last_valid) | (df['A'].notna()) # 生成结果DataFrame并重置索引 df_new = df[filter_mask].reset_index(drop=True)
输出验证
运行代码后得到的df_new与期望完全一致:
A B 0 NaN 22 1 NaN 33 2 NaN 44 3 NaN 55 4 45.0 66 5 1.0 22 6 2.0 34 7 3.0 67 8 6.0 66 9 8.0 34 10 9.0 33 11 15.0 44 12 18.0 6 13 NaN 96 14 NaN 64 15 NaN 93 16 NaN 81
内容的提问来源于stack exchange,提问作者EnigmAI
相关产品推荐
相关产品推荐

