使用 pandas 从 groupby 中选取随机元素

Picking random elements from groupby using pandas

我有这样的数据框:

    revisionId  itemId wikidataType
1    307190482      23           Q5
6    305019084      80           Q5
8    303692414     181           Q5
9    306600439     192           Q5
11   294597048     206           Q5

在完整的数据框中,wikidataType 列中存在 100 个这样的不同值。它是一个大数据框,所以我想将它限制为每个 wikidataType 1000 条记录。因此,我使用了以下内容:

df = df[df.groupby('wikidataType')['wikidataType'].cumcount() < 1000]

这为每个 wikidataType 提供了前 1000 条记录。我想随机选择这1000条记录。所以我尝试使用

df = df[random.sample(list(df.groupby('wikidataType')['wikidataType']), 1000)]

但报错为:

TypeError: 'Series' objects are mutable, thus they cannot be hashed

我什至试过了

 df = df[df.groupby('wikidataType')['wikidataType'].cumcount().random() < 1000]

但这也没有用。有人知道我该怎么做吗?

提前致谢。

我推荐的一种更简单的方法,如果你想要 first 1000 个元素,将使用 groupby + head:

df = df.groupby('wikidataType').head(1000)

如果您想要 1000 个 随机 个元素,请调用 sample:

df = df.groupby('wikidataType', group_keys=False)\
                           .apply(lambda x: x.sample(1000))

您可以选择指定分数:

df = df.groupby('wikidataType', group_keys=False)\
                           .apply(lambda x: x.sample(frac=len(x) * .1)) 

这给你每种元素类型的 10%。如果您的总体规模不同,或者如果您在任何组中的元素少于 1000 个,这将有所帮助。


根据您的评论对该方法稍作修改:

df = df.groupby('wikidataType', group_keys=False)\
               .apply(lambda x: x.sample(1000) if len(x) > 1000 else x)