如何删除Pandas中存在全NaN列的分组的所有行?
解决方案:删除存在全NaN列的分组
步骤说明
要实现「删除分组内存在任意一列全为NaN的所有行」,可以用Pandas按以下步骤操作:
- 按分组键(比如示例中的
ID)分组,检查每个分组的每一列是否全部为NaN; - 筛选出存在至少一列全NaN的分组ID;
- 从原数据中排除这些分组的所有行。
代码实现
先构造示例数据:
import pandas as pd import numpy as np # 示例数据 data = { 'ID': [1,1,2,2,3,3,4,4], 'Column A': [1,2,3,4,np.nan,6,np.nan,np.nan], 'Column B': [np.nan,np.nan,5,6,7,np.nan,8,9] } df = pd.DataFrame(data)
然后执行筛选:
# 1. 按ID分组,统计每列是否全为NaN group_col_nan = df.groupby('ID').agg(lambda col: col.isna().all()) # 2. 找出存在至少一列全NaN的分组ID bad_groups = group_col_nan[group_col_nan.any(axis=1)].index # 3. 保留合格分组的行 filtered_df = df[~df['ID'].isin(bad_groups)]
简化写法
如果想更简洁,也可以把步骤合并成一行:
filtered_df = df[~df['ID'].isin(df.groupby('ID').agg(lambda col: col.isna().all()).any(axis=1).loc[lambda x: x].index)]
结果验证
处理后的filtered_df会保留ID=2(无NaN)和ID=3(无全NaN列)的所有行,删除ID=1(Column B全NaN)和ID=4(Column A全NaN)的所有行,完全符合需求。
内容的提问来源于stack exchange,提问作者Stijn Berendse
相关产品推荐
相关产品推荐

