Pandas按指定列分组后,删除组内存在非空col2时的空值行
Pandas分组筛选:保留组内非空col2记录或全空组
构造示例数据集
先还原你提供的数据集:
import pandas as pd import numpy as np df = pd.DataFrame({ 'col1': ['A', 'A', 'A', 'A', 'A', 'B', 'B'], 'col2': [1, np.nan, np.nan, 1, np.nan, np.nan, np.nan], 'col3': [5, 5, 5, 2, 2, 3, 4], 'col4': ['x', 'y', 'z', 'z', 'z', 'z', 'z'] })
实现筛选逻辑
核心思路:按['col1','col3']分组后,标记每组是否存在非空的col2值,再筛选出两类行:
- 组内存在非空
col2时,只保留col2非空的行 - 组内所有
col2都为空时,保留整组所有行
代码实现:
# 给每行标记所在组是否存在非空col2 df['has_non_null_col2'] = df.groupby(['col1', 'col3'])['col2'].transform(lambda x: x.notna().any()) # 筛选符合条件的行,临时标记列可以删除 result_df = df[(df['col2'].notna()) | (~df['has_non_null_col2'])].drop(columns='has_non_null_col2') # 可选:重置索引和示例结果对齐 result_df = result_df.reset_index(drop=True)
输出结果
执行后result_df内容如下:
col1 col2 col3 col4 0 A 1.0 5 x 1 A 1.0 2 z 2 B NaN 3 z 3 B NaN 4 z
完全匹配你期望的结果:A-5、A-2组删除了col2为空的行,B-3、B-4组因无col2非空记录,全部保留。
内容的提问来源于stack exchange,提问作者moein
相关产品推荐
相关产品推荐

