如何删除Pandas DataFrame中开头的全NaN行而非所有全NaN行?
解决方法
核心思路是定位到第一个非全NaN行,从该行开始截取数据,既能删掉开头的全NaN行,又能保留后续出现的全NaN行。
具体实现步骤
标记全NaN行
用df.isna().all(axis=1)生成布尔序列,每行对应True(全NaN)或False(非全NaN)。找到第一个非全NaN行的索引
对布尔序列取反后用idxmax(),就能拿到第一个非全NaN行的位置:
first_valid_idx = (~df.isna().all(axis=1)).idxmax()
- 截取目标数据
从第一个非全NaN行开始,保留所有后续行:
df_cleaned = df.loc[first_valid_idx:]
完整示例
import pandas as pd import numpy as np # 构造带开头全NaN行的示例DataFrame df = pd.DataFrame({ 'A': [np.nan, np.nan, 1, 2, np.nan, 3], 'B': [np.nan, np.nan, 4, np.nan, np.nan, 6] }) # 标记全NaN行 all_nan_rows = df.isna().all(axis=1) # 定位第一个非全NaN行 first_valid_idx = (~all_nan_rows).idxmax() # 清理数据 df_cleaned = df.loc[first_valid_idx:] print(df_cleaned)
输出结果:
A B 2 1.0 4.0 3 2.0 NaN 4 NaN NaN 5 3.0 6.0
可以看到开头的两行全NaN被删除,中间的全NaN行(第4行)完好保留。
边界情况处理
如果整个DataFrame都是全NaN,(~all_nan_rows).idxmax()会返回索引0,此时df.loc[0:]就是原数据,不会出现报错或异常截取。
内容的提问来源于stack exchange,提问作者Krishnendu Dutta
相关产品推荐
相关产品推荐

