2017-10-21 14 views
0

j'ai dataframe qui ressemble à ceci:Picking éléments aléatoires de l'aide GroupBy pandas géants

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

En dataframe complète, il y a 100 ces différentes valeurs présentes dans la colonne wikidataType. C'est un grand dataframe, donc je veux le limiter à 1000 enregistrements par wikidataType. Par conséquent, je suit chose:

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

Cela donne e comme 1000 premiers enregistrements pour chaque wikidataType. Je veux choisir ces 1000 enregistrements au hasard. Alors j'ai essayé d'utiliser

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

Mais donné une erreur:

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

J'ai même essayé

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

Mais cela aussi ne fonctionne pas. Quelqu'un sait comment je peux faire ça?

Merci d'avance.

Répondre

2

Une méthode plus simple que je vous recommande, si vous voulez que les premiers 1000 éléments, serait d'utiliser groupby + head:

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

Si vous souhaitez 1000 éléments aléatoires, appelez sample:

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

Vous pouvez choisir de spécifier une fraction à la place:

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

Ce qui vous donne 10% de chaque type d'élément. Cela aiderait si la taille de votre population varie, ou si vous avez moins de 1000 éléments dans un groupe.


Une légère modification de cette méthode, en fonction de votre commentaire, serait:

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

J'ai besoin de 1000 dossiers au hasard. Pas d'abord 1000. –

+0

@NilakshiNaphade ouais, j'ajoutais ça dans. Voir edit. –

+0

J'ai probablement besoin de cette dernière chose. Mais je veux comme min 1000 ou tout si la taille est inférieure à 1000. –