我的数据框如下所示:
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:&#39;系列&#39;对象是可变的,因此它们不能被散列
我甚至尝试过
df = df[df.groupby('wikidataType')['wikidataType'].cumcount().random() < 1000]
但那也没有用。任何人都知道我该怎么做?
提前致谢。
答案 0 :(得分:4)
如果您想要第一个 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)