2017-10-21 101 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. –