Python 如何保持重复的行在数据库中正好重复n次
我有一个数据帧,看起来像这样,有大约10k行: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
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 +