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)


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.


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)]

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)

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]

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.


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])

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.