【问题标题】:How to keep duplicated rows that repeat exactly n times in pandas DataFame如何在pandas DataFrame中保留重复n次的重复行
【发布时间】:2020-04-30 18:41:49
【问题描述】:

我的 DataFrame 看起来像这样,大约有 10k 行:

    peak start  peak end    motif_start   motif_end    strand   
0   948         177         3210085       3210103      -        
1   948         177         3210047       3210065      +        
2   062         419         3223269       3223287      -        
3   062         419         3223229       3223247      +        
4   062         419         3223232       3223250      +
.
.
.   

“峰值开始”列中的某些行重复了 2 到 8 次。我需要切出一个新的 DataFrame 行,该行恰好重复 n 次(n 在 2 到 8 之间)。

期望的输出:

n=2
    peak start  peak end    motif_start   motif_end    strand   
0   948         177         3210085       3210103      -        
1   948         177         3210047       3210065      +
n=3
    peak start  peak end    motif_start   motif_end    strand
2   062         419         3223269       3223287      -        
3   062         419         3223229       3223247      +        
4   062         419         3223232       3223250      +

每个 n 以此类推。

我试过了:

new_df = df.groupby('peak start').head(n)

但它也返回前 n 行,用于重复 n 次以上的行。

我是 Python 新手,所以寻找可能我不知道的现有方法,而不是遍历数据框并计数。

有什么想法吗?

【问题讨论】:

    标签: python pandas dataframe duplicates


    【解决方案1】:

    .transformcount 与布尔过滤器一起使用。

    s = df.groupby('peak_start')['peak_start'].transform('count')
    

    df[s == 2]
       peak_start  peak_end  motif_start  motif_end strand
    0         948       177      3210085    3210103      -
    1         948       177      3210047    3210065      +
    
    
    print(df[s == 3])
    
       peak_start  peak_end  motif_start  motif_end strand
    2          62       419      3223269    3223287      -
    3          62       419      3223229    3223247      +
    4          62       419      3223232    3223250      +
    

    【讨论】:

      【解决方案2】:

      使用GroupBy.transformsize 来执行boolean indexing

      m = df.groupby(['peak start'])['peak start'].transform('size')
      #if you want to consider both
      #m = df.groupby(['peak start', 'peak end'])['peak start'].transform('size') 
      

      现在您可以过滤数据框了:

      df.loc[m.between(2, 8)] #inclusive = True by default 
      
          peak start  peak end    motif_start   motif_end    strand   
      0   948         177         3210085       3210103      -        
      1   948         177         3210047       3210065      +        
      2   062         419         3223269       3223287      -        
      3   062         419         3223229       3223247      +        
      4   062         419         3223232       3223250      +
      

      df.loc[m.eq(2)]
      
          peak start  peak end    motif_start   motif_end    strand   
      0   948         177         3210085       3210103      -        
      1   948         177         3210047       3210065      +
      

      df.loc[m.eq(3)]
      
      
          peak start  peak end    motif_start   motif_end    strand
      2   062         419         3223269       3223287      -        
      3   062         419         3223229       3223247      +        
      4   062         419         3223232       3223250      +
      

      我们也可以使用value_counts

      m = df['peak start'].value_counts()
      df.loc[df['peak start'].map(m).eq(2)]
      

      GroupBy.filter

      n = 2
      my_range = range(2-1, 8+1)
      df.groupby('peak_start').filter(lambda group: len(group) == n)
      df.groupby('peak_start').filter(lambda group: len(group) in my_range)
      

      【讨论】:

        猜你喜欢
        • 2018-03-28
        • 2017-05-10
        • 2019-09-05
        • 2015-10-26
        • 1970-01-01
        • 2014-07-16
        • 1970-01-01
        • 2020-10-16
        • 2019-07-19
        相关资源
        最近更新 更多