Pandas基于groupby分组条件删除DataFrame对应行的实现方法
方案1:使用transform构造布尔索引(效率更高,适合大数据量)
核心逻辑是先给每一行标记对应cell分组的大小,再根据规则筛选行:
import pandas as pd # 计算每个cell分组的大小,生成和原df行数一致的序列 group_size = df.groupby('cell')['cell'].transform('count') # 构造筛选规则:分组大小为1全部保留;分组大小>1时仅保留value不为"NA"的行 filter_mask = (group_size == 1) | ((group_size > 1) & (df['value'] != "NA")) # 执行筛选得到结果 result_df = df[filter_mask]
方案2:使用groupby + apply(逻辑直观,易自定义)
直接对每个分组单独处理,符合需求的返回,不符合的删除对应行:
def process_group(group): # 分组行数大于1时过滤掉NA行 if len(group) > 1: return group[group['value'] != "NA"] # 分组行数为1时直接返回全部行 return group # group_keys=False避免生成额外的分组索引层级 result_df = df.groupby('cell', group_keys=False).apply(process_group)
注意事项
如果你的cell列存在空值,且需要保留空值对应的分组,可在groupby时添加dropna=False参数,即df.groupby('cell', dropna=False)。
内容的提问来源于stack exchange,提问作者anjali
相关产品推荐
相关产品推荐

