从数据框中随机删除行,以便不存在计数超过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'
)
我该怎么做呢?
回答
首先使用sample和frac参数1(基本上“采样”整个数据帧)对整个数据帧进行混洗。该replace=False参数防止熊猫在采样过程中两次选择同一行。
然后用于head获取前 N 次出现(随机顺序,因为我们只是对行进行了洗牌):
df.sample(frac=1, replace=False).groupby('topic').head(5000)