Python Pandas基于多列多条件关联删除同ID所有对应行的实现问题
Pandas按ID整组筛选实现方案
核心逻辑为以ID为单位做校验:仅当该ID对应的全部行都满足confTyp == 'new'、trType == 'order'、Version == 1三个条件时,才保留该ID下所有条目,否则删除该ID的全部行。
方案1:groupby + filter (中小数据量优先,代码简洁)
直接按ID分组后对全组做校验,符合条件的分组直接保留:
res_df = df.groupby('ID').filter( lambda x: ((x['confTyp'] == 'new') & (x['trType'] == 'order') & (x['Version'] == 1)).all() )
方案2:矢量化校验筛选(大数据量优先,性能更高)
全矢量化操作,避免分组遍历的性能开销,适合百万行以上的数据集:
# 生成单行是否符合条件的掩码 row_mask = (df['confTyp'] == 'new') & (df['trType'] == 'order') & (df['Version'] == 1) # 按ID分组校验每个ID的所有行是否全部符合要求 id_mask = row_mask.groupby(df['ID']).transform('all') # 过滤得到最终结果 res_df = df[id_mask]
原df.drop()方案失效原因
直接删除不符合条件的单行,会残留对应ID下原本符合条件的行,无法满足「单条不符合则删除整个ID所有条目」的规则,因此必须先做ID维度的整体校验再过滤。
内容的提问来源于stack exchange,提问作者Sam A
相关产品推荐
相关产品推荐

