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

如何按uniqueID分组移除Pandas数据框中的连续重复项

问题:如何仅移除同一uniqueID下的连续重复项?

原始数据

读取并打印的数据框如下:

df = pd.read_csv('filename.csv', delimiter=',')

print(df)
idx   uniqueID      String 

0        1           'hello'
1        1           'goodbye'
2        1           'goodbye'
3        1           'happy'
4        2           'hello'
5        2           'hello'
6        2           'goodbye'
7        3           'goodbye' 
8        3           'hello'
9        3           'hello'
10       4           'hello'
11       5           'goodbye'

预期输出

处理后希望得到的结果:

idx   uniqueID      String 

0        1           'hello'
1        1           'goodbye'
3        1           'happy'
4        2           'hello'
6        2           'goodbye'
7        3           'goodbye' 
8        3           'hello'
10       4           'hello'
11       5           'goodbye'

我尝试的代码

df = df[(df['String '].shift() != df['String ']) | (df['uniqueID'] != df['uniqueID'])]

不确定该加什么条件来确保只针对同一个uniqueID处理,求建议。


解决方案

要实现这个需求,得先按uniqueID分组,在每个组内判断当前行的String 是否和组内上一行的String 重复,这样就能精准过滤同一ID下的连续重复项。

推荐两种写法:

写法一(简洁版)

df = df[df.groupby('uniqueID')['String '].shift() != df['String ']]

写法二(更严谨,明确保留每组首行)

# 生成组内非连续重复的标记
mask = df.groupby('uniqueID')['String '].shift() != df['String ']
# 把每组的第一行(shift后为NaN的行)也保留
mask = mask | df.groupby('uniqueID')['String '].shift().isna()
df = df[mask]

逻辑说明

  • df.groupby('uniqueID')['String '].shift():对每个uniqueID分组后,将组内的String 列向下偏移一行,让每个位置对应组内上一行的String 内容。
  • 比较偏移后的值和原String 列,不等的行就是需要保留的;而每组的第一行偏移后是NaN,NaN和任何值比较结果都是False,所以需要额外把这些行标记为保留,确保每个ID的第一条记录不会被误删。

这样处理后就能得到你要的预期输出——仅移除同一uniqueID下连续重复的行,不同ID之间的重复不会被处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 07:11:05