Pandas中如何删除分组后数量为1的DataFrame行?
解决方案
方法1:利用groupby.transform实现行筛选
这是最简洁通用的方式,transform会将分组计算的结果映射回原数据的每一行,直接完成行级判断:
# 给原数据添加临时列,存储对应Bairro的总行数 df['bairro_count'] = df.groupby('Bairro')['Bairro'].transform('size') # 筛选出分组行数大于1的行,最后可删除临时列 df_filtered = df[df['bairro_count'] > 1].drop('bairro_count', axis=1)
方法2:先提取有效Bairro列表再筛选
基于你已经生成的筛选结果,先拿到所有符合条件的Bairro值,再过滤原数据:
# 生成分组计数的判断结果(和你之前的代码一致) filter_series = df.groupby('Bairro').size() > 1 # 提取判断为True的Bairro名称 valid_bairros = filter_series[filter_series].index.tolist() # 筛选原数据中Bairro属于有效列表的行 df_filtered = df[df['Bairro'].isin(valid_bairros)]
你之前尝试方法的问题说明
- 方法1:
df.groupby(['Bairro']).size() != 1得到的是分组后的Series,仅包含每个Bairro的判断结果,无法直接对应原数据的每一行,因此不能用来过滤原数据 - 方法2:
~df.isin(['02']).any(axis=1)会检查所有列是否包含'02',若其他列存在该值会误删数据;同时如果有多个无效Bairro,这种逐个指定的方式扩展性差 - 方法3:
df.groupby(...).size()返回的结果和原数据的行索引不匹配,无法直接作为drop方法的参数使用
内容的提问来源于stack exchange,提问作者Ricardo Muraoka
相关产品推荐
相关产品推荐

