Python 如果重复次数超过n次,则删除数据帧中的连续重复项
以问题/解决方案为基础,我试图设置一个参数,该参数仅在相同值连续出现5次(或更多)时删除连续的重复项 我可以在链接文章中应用解决方案,该解决方案使用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
.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