【问题标题】:Drop consecutive duplicates in Pandas dataframe if repeated more than n times如果重复超过 n 次,则删除 Pandas 数据框中的连续重复项
【发布时间】:2020-07-31 23:27:05
【问题描述】:

基于问题/解决方案here,我正在尝试设置一个参数,如果相同的值连续出现 5 次(或更多)次,则该参数只会删除连续的重复项...

我可以在链接的帖子中应用解决方案,它使用.shift() 检查以前的(或通过调整班次周期参数在过去或未来指定的值)是否等于当前值,但怎么可能我调整它以同时检查几个连续的值?

假设一个如下所示的数据框:

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。

【问题讨论】:

    标签: python pandas dataframe duplicates


    【解决方案1】:

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

    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]
    

    输出:

         x  y
    0    1  2
    1    2  2
    2    3  3
    7    8  4
    8    9  4
    9   10  4
    10  11  4
    11  12  2
    

    【讨论】:

    • 非常接近@Quang Hoang!但是我想将行保留在原始 df 的索引 2 - 如果我们发现出现五个或更多连续重复,则保留第一个实例并删除以下连续重复。谢谢!
    • @azam 我明白了,更新了答案以保留第一行。
    • 适用于测试数据集以及应用于完整数据集时!
    • 补充这一点,想知道您的想法:您是否考虑将它们设置为 NaN 以保持 df 的原始形状,而不是丢弃连续的重复项?
    • df.loc[~(small_size | first_rows)] = np.nan.
    【解决方案2】:

    不是直截了当,我会选择@Quang Hoang

    创建一个列,给出重复值的次数。在这种情况下,我使用了np.where()df.duplicated() 并将任何count&gt; 4 分配为NaN

    df['g']=np.where(df.groupby('y').transform(lambda x: x.duplicated(keep='last').count())>4, np.nan,1)
    

    然后我创建两个数据框。一个我放弃了所有的NaNs,一个只有NaNs。在带有NaNs 的那个中,除了使用.last_valid_index() 的最后一个索引之外,我都放弃了所有内容。然后我附加它们并使用.sort_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
    

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 2012-10-09
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      相关资源
      最近更新 更多