Existe-t-il un moyen de sélectionner des lignes aléatoires à partir d'un DataFrame dans Pandas.
Dans R, en utilisant le package voiture, il existe une fonction utile some(x, n)
qui est similaire à head mais qui sélectionne, dans cet exemple, 10 lignes au hasard à partir de x.
J'ai également regardé la documentation de découpage et il ne semble y avoir rien d'équivalent.
Mettre à jour
Utilisant maintenant la version 20. Il existe un exemple de méthode.
df.sample(n)
df.sample(N, replace=True)
. Plus de détails ici .Réponses:
Quelque chose comme ça?
Remarque: Depuis Pandas v0.20.0,
ix
a été déconseillée au profit de l'loc
indexation basée sur les étiquettes.la source
df.ix[np.random.random_integers(0, len(df), 10)]
cela fonctionnerait également.df.ix[np.random.choice(df.index, 10)]
.np.random.choice
c'était deux fois plus rapide querandom.sample
Avec la version pandas
0.16.1
et les versions ultérieures, il existe maintenant uneDataFrame.sample
méthode intégrée :Pour l'une ou l'autre approche ci-dessus, vous pouvez obtenir le reste des lignes en faisant:
la source
df_0.7
n'est pas un nom valide. De plus, je suggère de remplacerdf_rest = df.loc[~df.index.isin(df_0_7.index)]
pardf_rest = df.loc[df.index.difference(df_0_7.index)]
.difference()
?df_percent.index.get_indexer(df.index) == -1
est bien plus efficace à la place (mais aussi plus moche) ...sample
À partir de la v0.20.0, vous pouvez utiliser
pd.DataFrame.sample
, qui peut être utilisé pour renvoyer un échantillon aléatoire d'un nombre fixe de lignes, ou un pourcentage de lignes:Pour la reproductibilité, vous pouvez spécifier un entier
random_state
, équivalent à utilisernp.ramdom.seed
. Ainsi, au lieu de définir, par exemplenp.random.seed = 0
, vous pouvez:la source
La meilleure façon de le faire est d'utiliser la fonction exemple du module aléatoire,
la source
En fait, cela vous donnera des indices répétés
np.random.random_integers(0, len(df), N)
oùN
est un grand nombre.la source
La ligne ci-dessous sélectionnera au hasard n nombre de lignes sur le nombre total de lignes existantes de la trame de données df sans remplacement.
df=df.take(np.random.permutation(len(df))[:n])
la source