从数据框中随机删除行,以便不存在计数超过N的行

给定一个df编码主题和项目的数据框,看起来像

topic    item
0        bucket
1        fish
2        car
0        pail
2        truck
3        glove 

哪里有X主题和Y项目,这样如果我查看每个主题的项目数

print(df.groupby(by='topic').agg('count'))

                 item
topic                
0                8568   
1                7539  
2               48700   
3               26036   
4                4190  
5                2153 
...               ...
X-2               328
X-1              5942
X               15871

我怎么能做到这一点,没有主题的关联项目不超过 N 个?例如,让我们说N = 5000。然后,如果我做一个计数,我会得到

print(df.groupby(by='topic').agg('count'))

                 item
topic                
0                5000   
1                5000  
2                5000   
3                5000   
4                4190  
5                2153 
...               ...
X-2               328
X-1              5000
X                5000

超过 5000 计数的所有内容都减少到 5000 计数,而低于 5000 计数的所有内容都保持不变。删除的行也需要随机删除,而不仅仅是第一个出现。

psuedocode:

# Randomly drops rows by topic until there are no topics that have a count
# above 5000
df.drop_rows_by_count(
                      based_on='topic'
                      above_below='above', 
                      count=5000,
                      how='random'
)

我该怎么做呢?

回答

首先使用samplefrac参数1(基本上“采样”整个数据帧)对整个数据帧进行混洗。该replace=False参数防止熊猫在采样过程中两次选择同一行。

然后用于head获取前 N 次出现(随机顺序,因为我们只是对行进行了洗牌):

df.sample(frac=1, replace=False).groupby('topic').head(5000)


以上是从数据框中随机删除行,以便不存在计数超过N的行的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>