You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:45:43