Zufällige Zeilenauswahl im Pandas-Datenrahmen

159

Gibt es eine Möglichkeit, zufällige Zeilen aus einem DataFrame in Pandas auszuwählen?

In R gibt es unter Verwendung des Fahrzeugpakets eine nützliche Funktion, some(x, n)die dem Kopf ähnlich ist, in diesem Beispiel jedoch 10 zufällige Zeilen aus x auswählt.

Ich habe mir auch die Schnittdokumentation angesehen und es scheint nichts Äquivalentes zu geben.

Aktualisieren

Jetzt mit Version 20. Es gibt eine Beispielmethode.

df.sample(n)

John
quelle
1
Wenn Sie ein Beispiel suchen, bei dem die Größe größer als das Original ist, verwenden Sie df.sample(N, replace=True). Weitere Details hier .
CS95

Antworten:

57

Etwas wie das?

import random

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

Hinweis: Ab Pandas v0.20.0, ix ist veraltet zugunsten von locfür den Etikettenbasierte Indexierung.

Eumiro
quelle
8
Danke @eumiro. Ich habe auch herausgefunden, dass df.ix[np.random.random_integers(0, len(df), 10)]das auch funktionieren würde.
John
7
Wenn Sie numpy verwenden möchten, können Sie dies auch tun df.ix[np.random.choice(df.index, 10)].
naught101
7
Jemand in einem anderen Beitrag erwähnte, dass np.random.choicedas doppelt so schnell ist wierandom.sample
Phani
5
Wenn Sie np.random.choice verwenden, müssen Sie replace = False angeben, sonst erhalten Sie doppelte Zeilen!
stmax
2
Ich denke, ".ix" ist veraltet, und Sie sollten .loc für die markenbasierte Indizierung verwenden
compguy24
266

Ab der Pandas-Version 0.16.1ist jetzt eine DataFrame.sample Methode integriert :

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)

Für beide oben genannten Ansätze können Sie den Rest der Zeilen abrufen, indem Sie Folgendes tun:

df_rest = df.loc[~df.index.isin(df_percent.index)]
Ryanjdillon
quelle
df_0.7ist kein gültiger Name. Außerdem schlage ich vor , Ersatz df_rest = df.loc[~df.index.isin(df_0_7.index)]mit df_rest = df.loc[df.index.difference(df_0_7.index)].
Pietro Battiston
@PietroBattiston Danke. Ich habe versucht, die Antwort klarer zu machen, aber ich stimme zu, dass ein nicht funktionierendes Beispiel nicht klar ist. Schön mit dem Tipp auf Unterschied. Trotzdem schreibe ich das Schneiden lieber so, dass ich es als Index "nicht im Index meiner Stichprobe" lese. Gibt es eine Leistungssteigerung mit difference()?
Ryanjdillon
1
@ryanjdillon gab es einen verbleibenden Tippfehler, ich habe es behoben. In Bezug auf die Methode nehme ich meinen Vorschlag zurück, da er in der Tat etwas weniger effizient ist. df_percent.index.get_indexer(df.index) == -1ist weitaus effizienter (aber auch hässlicher) ...
Pietro Battiston
18

sample

Ab Version 0.20.0 können Sie Folgendes pd.DataFrame.sampleverwenden, um eine zufällige Stichprobe von Zeilen mit fester Anzahl oder einen Prozentsatz von Zeilen zurückzugeben:

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

Aus Gründen der Reproduzierbarkeit können Sie eine Ganzzahl angeben random_state, die der Verwendung entspricht np.ramdom.seed. Anstatt beispielsweise zu setzen, np.random.seed = 0können Sie:

df = df.sample(n=k, random_state=0)
jpp
quelle
7

Der beste Weg, dies zu tun, ist mit der Beispielfunktion aus dem Zufallsmodul.

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]
rlmlr
quelle
4

Tatsächlich erhalten Sie dadurch wiederholte Indizes, bei np.random.random_integers(0, len(df), N)denen Nes sich um eine große Zahl handelt.

rlmlr
quelle
3

Unter der Zeile werden zufällig n Zeilen aus der Gesamtzahl der vorhandenen Zeilennummern aus dem Datenrahmen df ohne Ersatz ausgewählt.

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

Mojgan Mazouchi
quelle