2017-10-21 180 views
0

我有数据帧,看起来像这样:采摘使用GROUPBY熊猫随机元素

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] 

但也没有工作。任何人都知道我该怎么做?

在此先感谢。

回答

2

,我会建议,如果你想第一 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) 
+0

我需要1000条记录中随机。不是第一个1000. –

+0

@NilakshiNaphade是的,我在添加。请参阅编辑。 –

+0

我可能会需要最后一小部分的东西。但我想要1000分或全部如果大小小于1000. –