如何高效筛选满足组级条件的DataFrame:全量值>70或全为np.nan
高效筛选符合条件的分组DataFrame
原始数据
import pandas as pd import numpy as np df = pd.DataFrame({ "group": [1,1,1, 2,2,2,2, 3,3,3, 4,4], "percentage": [70,70,70, 45,80,60,70, 71,85,90, np.nan, np.nan] })
需求
筛选满足以下任一条件的组,返回对应DataFrame:
- 组内所有
percentage观测值均大于70 - 组内所有
percentage观测值均为np.nan
高效解决方案
利用pandas的分组聚合+向量操作实现,避免循环,大幅提升效率:
方法1:分组聚合生成组掩码,再筛选
# 计算每个组是否符合条件 group_mask = df.groupby("group")["percentage"].agg( lambda x: x.gt(70).all() or x.isna().all() ) # 筛选原DataFrame中符合条件的组 result_df = df[df["group"].isin(group_mask[group_mask].index)]
方法2:用transform直接生成行级掩码,一步筛选
# 生成每个行对应的组是否满足条件的布尔序列 cond_all_gt70 = df.groupby("group")["percentage"].transform(lambda x: x.gt(70).all()) cond_all_nan = df.groupby("group")["percentage"].transform(lambda x: x.isna().all()) # 合并条件筛选结果 result_df = df[cond_all_gt70 | cond_all_nan]
结果验证
最终返回的result_df包含组3(全大于70)和组4(全为NaN)的所有行:
group percentage 7 3 71.0 8 3 85.0 9 3 90.0 10 4 NaN 11 4 NaN
内容的提问来源于stack exchange,提问作者MF1992
相关产品推荐
相关产品推荐

