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

Pandas按[id,value]分组取每组首行,仅按id分组结果不符如何解决

问题描述

我遇到了分组取首行的需求,但存在特殊情况:同一个id的首行可能属于多个分组。
我有如下pandas DataFrame:

df = pd.DataFrame({'id' : [1,1,1,2,2,3,3,3,3,1,1,2,6,6,6,7,7],
                'value'  : ["first","second","second","first",
                            "second","first","third","fourth",
                            "fifth","second","fifth","first",
                            "first","second","third","fourth","fifth"]})

完整数据如下:

id   value
0        1   first
1        1  second
2        1  second
3        2   first
4        2  second
5        3   first
6        3   third
7        3  fourth
8        3   fifth
9        1  second
10       1   fifth
11       2   first
12       6   first
13       6  second
14       6   third
15       7  fourth
16       7   fifth

我的需求是按["id","value"]两个字段分组,取每个分组的第一行,预期输出如下:

id   value
     1   first
     2   first
     3   first
     1  second
     2  first
     6  first
     7  fourth

我尝试了仅按id分组取首行的方案:

df.groupby('id').first()

得到结果如下:

value
id        
1    first
2    first
3    first
6    first
7   fourth

该结果不符合预期,仅按id分组会合并所有同id的行只返回第一个,无法满足按id和value组合分组取首行的需求。

解决方案

根据实际需求场景,对应两种实现方案:

场景1:全局同id+value组合仅保留第一次出现的行

即只要是id和value都相同的行,不管中间有没有插入其他行,全局只保留第一次出现的那一行,直接使用drop_duplicates方法即可:

# subset指定去重依据的字段,keep='first'表示保留首次出现的行
res = df.drop_duplicates(subset=['id', 'value'], keep='first').reset_index(drop=True)

场景2:仅连续重复的id+value组合去重

即相同id+value组合如果中间隔了其他行后再次出现,视为新分组保留首行,仅合并连续重复的行,通过和前一行比较实现:

# 生成掩码:当前行和前一行的id或value不同时,判定为新分组首行
mask = (df['id'] != df['id'].shift()) | (df['value'] != df['value'].shift())
res = df[mask].reset_index(drop=True)

如果需要保留原来的行索引,去掉reset_index(drop=True)即可。


内容的提问来源于stack exchange,提问作者Dr Xorile

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:36:04