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

