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
相关产品推荐
相关产品推荐

