Python 如何保持重复的行在数据库中正好重复n次

Python 如何保持重复的行在数据库中正好重复n次,python,pandas,dataframe,duplicates,Python,Pandas,Dataframe,Duplicates,我有一个数据帧,看起来像这样,有大约10k行: peak start peak end motif_start motif_end strand 0 948 177 3210085 3210103 - 1 948 177 3210047 3210065 + 2 062 419 322

我有一个数据帧,看起来像这样,有大约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次。我需要剪切到一个新的数据帧行,该行正好重复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,依此类推

我试过:

new_df = df.groupby('peak start').head(n)
但对于重复次数超过n次的行,它也返回前n行

我是Python新手,所以我在寻找可能是我不知道的现有方法,而不是迭代数据帧并计数

有什么想法吗

大小一起使用
以提高性能

现在,您可以筛选数据帧:

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      +



我们还可以使用
value\u计数

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


使用带有布尔过滤器的
.transform
count

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

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      +
m = df['peak start'].value_counts()
df.loc[df['peak start'].map(m).eq(2)]
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)
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      +