我有这样的数据框:
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]
但这也没有用。任何人都知道我该怎么做?
提前致谢。
最佳答案
如果您想要前 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)
关于python - 使用 Pandas 从groupby中挑选随机元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46861899/