Selezione di righe casuali nel frame di dati Panda


159

C'è un modo per selezionare righe casuali da un DataFrame in Panda.

In R, usando il pacchetto auto, c'è un'utile funzione some(x, n)che è simile a head ma seleziona, in questo esempio, 10 righe a caso da x.

Ho anche esaminato la documentazione sul taglio e non sembra esserci nulla di equivalente.

Aggiornare

Ora usando la versione 20. C'è un metodo di esempio.

df.sample(n)


1
Se stai cercando di campionare dove la dimensione è maggiore dell'originale, usa df.sample(N, replace=True). Maggiori dettagli qui .
cs95,

Risposte:


57

Qualcosa come questo?

import random

def some(x, n):
    return x.ix[random.sample(x.index, n)]

Nota: A partire da Pandas v0.20.0, ix è stato deprecato a favore locdell'indicizzazione basata su etichette.


8
Grazie @eumiro. Ho anche capito che df.ix[np.random.random_integers(0, len(df), 10)]avrebbe funzionato.
Giovanni

7
Se vuoi usare numpy, puoi farlo anche tu df.ix[np.random.choice(df.index, 10)].
naught101,

7
Qualcuno in un altro post ha detto che np.random.choiceè due volte più veloce dirandom.sample
Phani il

5
Se usi np.random.choice devi specificare sostituire = Falso, altrimenti otterrai righe duplicate!
stmax

2
Penso che ".ix" sia obsoleto e dovresti usare .loc per l'indicizzazione basata su etichette
compguy24

266

Con la versione Panda 0.16.1e successive, ora è DataFrame.sample incorporato un metodo :

import pandas

df = pandas.DataFrame(pandas.np.random.random(100))

# Randomly sample 70% of your dataframe
df_percent = df.sample(frac=0.7)

# Randomly sample 7 elements from your dataframe
df_elements = df.sample(n=7)

Per entrambi gli approcci precedenti, puoi ottenere il resto delle righe facendo:

df_rest = df.loc[~df.index.isin(df_percent.index)]

df_0.7non è un nome valido. Inoltre, suggerisco di sostituirlo df_rest = df.loc[~df.index.isin(df_0_7.index)]con df_rest = df.loc[df.index.difference(df_0_7.index)].
Pietro Battiston,

@PietroBattiston Grazie. Stavo cercando di rendere più chiara la risposta, ma concordo che un esempio non funzionante non è chiaro. Bello con il suggerimento sulla differenza. Tuttavia, preferisco ancora scrivere lo slicing in modo da leggerlo come indici "non nell'indice del mio campione". C'è un aumento delle prestazioni con difference()?
ryanjdillon,

1
@ryanjdillon c'era un errore di battitura rimanente, l'ho risolto. Per quanto riguarda il metodo, in realtà sto riprendendo il mio suggerimento, poiché in effetti è un po 'meno efficiente. df_percent.index.get_indexer(df.index) == -1invece è molto più efficiente (ma anche più brutto) ...
Pietro Battiston

18

sample

A partire da v0.20.0, è possibile utilizzare pd.DataFrame.sample, che può essere utilizzato per restituire un campione casuale di righe di un numero fisso o una percentuale di righe:

df = df.sample(n=k)     # k rows
df = df.sample(frac=k)  # int(len(df.index) * k) rows

Per la riproducibilità, è possibile specificare un numero intero random_state, equivalente all'utilizzo np.ramdom.seed. Quindi, invece di impostare, ad esempio, np.random.seed = 0puoi:

df = df.sample(n=k, random_state=0)

7

Il modo migliore per farlo è con la funzione di esempio dal modulo casuale,

import numpy as np
import pandas as pd
from random import sample

# given data frame df

# create random index
rindex =  np.array(sample(xrange(len(df)), 10))

# get 10 random rows from df
dfr = df.ix[rindex]

4

In realtà questo ti darà indici ripetuti np.random.random_integers(0, len(df), N)dove Nc'è un numero elevato.


3

La riga sotto selezionerà casualmente n numero di righe dal totale dei numeri di riga esistenti dal dataframe df senza sostituzione.

df=df.take(np.random.permutation(len(df))[:n])

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.