基于两列条件删除DataFrame数据:移除ColB非空计数为0的ColA分组所有行
实现方案
方案1:groupby + filter(写法最简洁)
直接用pandas分组内置的过滤方法,一行代码就能实现需求:
import pandas as pd # 假设原始df已创建完成 new_df = df.groupby('ColA').filter(lambda group: group['ColB'].notna().any())
逻辑说明:按ColA分组后,filter会保留满足条件的全部分组行,这里判断条件是分组内ColB存在至少一个非NaN值就保留整个分组,否则整组过滤。
方案2:groupby + transform(大数据量性能更优)
如果处理的数据量很大,transform的广播机制比逐组运行lambda效率更高,写法也很简洁:
# 生成布尔掩码:属于保留分组的行标记为True mask = df['ColB'].notna().groupby(df['ColA']).transform('any') new_df = df[mask]
逻辑说明:先给每行计算ColB是否非NaN的布尔值,再按ColA分组后把“该组是否有非NaN值”的结果广播到组内所有行,最后用布尔索引直接过滤即可。
内容的提问来源于stack exchange,提问作者dasrocko
相关产品推荐
相关产品推荐

