2016-06-28 12 views
8

sagen, ich habe einen Datenrahmen mit 100.000 Einträgen und will es in 100 Abschnitte von 1000 Einträgen spalten.Random Sample einer Teilmenge eines Datenrahmens in Pandas

Wie nehme ich eine zufällige Stichprobe von sagen Größe 50 von nur einer der 100 Abschnitte. Der Datensatz ist bereits so geordnet, dass die ersten 1000 Ergebnisse der erste Abschnitt, der nächste Abschnitt der nächste usw. sind.

vielen Dank

+0

'df.iloc [np.random.randint (1,1000,50) ,:]'. 'df1' ist einer der 100 Abschnitte. – Abdou

Antwort

4

Eine Lösung ist die choice Funktion von numpy zu verwenden. von 100

Sagen Sie bitte 50 Einträge möchten, können Sie verwenden:

import numpy as np 
chosen_idx = np.random.choice(1000, replace=False, size=50) 
df_trimmed = df.iloc[chosen_idx] 

Das ist natürlich nicht die Blockstruktur zu berücksichtigen. Wenn Sie einen 50 Artikel Probe aus Block i zum Beispiel möchten, können Sie tun:

import numpy as np 
block_start_idx = 1000 * i 
chosen_idx = np.random.choice(1000, replace=False, size=50) 
df_trimmed_from_block_i = df.iloc[block_start_idx + chosen_idx] 
10

Sie die sample Methode verwenden können *:

In [11]: df = pd.DataFrame([[1, 2], [3, 4], [5, 6], [7, 8]], columns=["A", "B"]) 

In [12]: df.sample(2) 
Out[12]: 
    A B 
0 1 2 
2 5 6 

In [13]: df.sample(2) 
Out[13]: 
    A B 
3 7 8 
0 1 2 

* Auf einem der Sektion Datenrahmen.

Hinweis: Wenn Sie eine größere Stichprobengröße als die Größe des DataFrames haben, wird dies zu einem Fehler führen, es sei denn, Sie erproben mit Ersatz.

In [14]: df.sample(5) 
ValueError: Cannot take a larger sample than population when 'replace=False' 

In [15]: df.sample(5, replace=True) 
Out[15]: 
    A B 
0 1 2 
1 3 4 
2 5 6 
3 7 8 
1 3 4 
Verwandte Themen