Python 如果重复次数超过n次,则删除数据帧中的连续重复项

Python 如果重复次数超过n次,则删除数据帧中的连续重复项,python,pandas,dataframe,duplicates,Python,Pandas,Dataframe,Duplicates,以问题/解决方案为基础,我试图设置一个参数,该参数仅在相同值连续出现5次(或更多)时删除连续的重复项 我可以在链接文章中应用解决方案,该解决方案使用.shift()检查上一个值(或通过调整shift periods参数来检查过去或将来的指定值)是否等于当前值,但我如何调整此值以同时检查多个连续值 假设数据帧如下所示: x y 1 2 2 2 3 3 4 3 5 3 6 3 7 3 8 4 9 4 10 4 11 4 12

以问题/解决方案为基础,我试图设置一个参数,该参数仅在相同值连续出现5次(或更多)时删除连续的重复项

我可以在链接文章中应用解决方案,该解决方案使用
.shift()
检查上一个值(或通过调整shift periods参数来检查过去或将来的指定值)是否等于当前值,但我如何调整此值以同时检查多个连续值

假设数据帧如下所示:

x    y

1    2
2    2
3    3
4    3
5    3
6    3
7    3
8    4
9    4
10   4
11   4
12   2
我正在努力做到这一点:

x    y

1    2
2    2
3    3
8    4
9    4
10   4
11   4
12   2

其中我们丢失了第4、5、6、7行,因为我们在y列中找到了五个连续的3。但是保留行1,2,因为我们在y列中只找到两个连续的2。类似地,保留第8、9、10、11行,因为我们在y列中只找到四个连续的4。

让我们尝试
cumsum
关于差异来找到连续的块。然后
groupby().transform('size')
获取块的大小:

thresh = 5
s = df['y'].diff().ne(0).cumsum()

small_size = s.groupby(s).transform('size') < thresh
first_rows = ~s.duplicated()

df[small_size | first_rows]

不是直截了当的,我会选择光环

创建一列,该列给出值的复制次数。在本例中,我使用了
np.where()
df.duplicated()
并将任何
count>4
赋值为
NaN

df['g']=np.where(df.groupby('y').transform(lambda x: x.duplicated(keep='last').count())>4, np.nan,1)
然后我创建两个数据帧。一个是我删除所有的
nan
,另一个是只有
nan
。在带有
NaNs
的索引中,我使用
.last\u valid\u index()
除去最后一个索引之外的所有索引。然后我附加它们并使用
.sort\u index()
按索引排序。我使用
iloc[:,:2])
切掉我在上面创建的新列

df.dropna().append(df.loc[df[df.g.isna()].last_valid_index()]).sort_index().iloc[:,:2]

     x    y
0    1.0  2.0
1    2.0  2.0
6    7.0  3.0
7    8.0  4.0
8    9.0  4.0
9   10.0  4.0
10  11.0  4.0
11  12.0  2.0

非常接近@Quang Hoang!但是我想保留原始df的索引2处的行-保留第一个实例,如果我们发现出现五个或更多的连续重复项,则删除以下连续重复项。谢谢大家!@我明白了,azam更新了答案以保留第一行。适用于测试数据集,并应用于完整数据集!除此之外,您还想知道自己的想法:与其删除连续的重复项,您是否想过将它们设置为NaN以保持df的原始形状?
df.loc[~(small_size | first_rows)]=np.NaN
df.dropna().append(df.loc[df[df.g.isna()].last_valid_index()]).sort_index().iloc[:,:2]

     x    y
0    1.0  2.0
1    2.0  2.0
6    7.0  3.0
7    8.0  4.0
8    9.0  4.0
9   10.0  4.0
10  11.0  4.0
11  12.0  2.0