Pandas如何按id、pos分组条件删除result为'--'的重复行
pandas 多分组条件过滤行实现方案
场景说明
使用Python的pandas库处理数据时,遇到如下结构的数据集:
id pos result 0 1 1 AB 1 1 1 -- 2 1 1 BC 3 1 1 AB 4 1 2 CA 5 2 1 CA 6 2 2 -- 7 2 2 BA 8 3 1 -- 9 3 1 --
需要按规则过滤后得到如下结果:
id pos result 0 1 1 AB 2 1 1 BC 3 1 1 AB 4 1 2 CA 5 2 1 CA 7 2 2 BA 8 3 1 -- 9 3 1 --
过滤规则
按id、pos两个字段分组执行判断:
- 同分组下存在A/B/C组合而成的非
--的result值时,删除该分组内所有result为--的行 - 同分组下不存在上述非
--有效值时,保留分组内所有result为--的行
实现方法
不用写自定义循环,用pandas原生的分组转换+布尔索引就能实现,性能更高,代码逻辑清晰:
import pandas as pd # 1. 构造原始数据集(如果已经从文件/其他源读入数据可以跳过这步) df = pd.DataFrame({ 'id': [1,1,1,1,1,2,2,2,3,3], 'pos': [1,1,1,1,2,1,2,2,1,1], 'result': ['AB', '--', 'BC', 'AB', 'CA', 'CA', '--', 'BA', '--', '--'] }) # 2. 按id、pos分组,标记每个分组是否存在非--的有效值 # transform('any')会把分组判断结果广播到每一行,和原df长度完全对齐 group_has_valid = df.assign(is_valid = df['result'] != '--')\ .groupby(['id', 'pos'])['is_valid']\ .transform('any') # 3. 布尔索引过滤:保留非--的行,或者所在分组没有有效值的--行 result_df = df[(df['result'] != '--') | (~group_has_valid)]
注意:transform方法返回的序列和原DataFrame索引完全对齐,不需要额外做拼接、关联操作,是pandas处理分组类过滤的最常用方式。
执行上述代码后打印result_df,即可得到符合要求的过滤结果。
内容的提问来源于stack exchange,提问作者chimaera
相关产品推荐
相关产品推荐

