2016-06-28 36 views
8

Powiedz, że mam ramkę danych z 100 000 wpisów i chcę podzielić ją na 100 sekcji z 1000 wpisów.Losowa próbka podzbioru ramki danych w Pandach

W jaki sposób mogę pobrać losową próbkę wielkości 50 na jedną ze 100 części. zestaw danych jest już uporządkowany, tak że pierwsze 1000 wyników to pierwsza sekcja następnej sekcji następnej i tak dalej.

wiele dzięki

+0

'df.iloc [np.random.randint (1,1000,50) ,:]'. 'df1' jest jedną ze 100 sekcji. – Abdou

Odpowiedz

4

Jednym z rozwiązań jest użycie funkcji choice z numpy.

Powiedzmy, że chcesz 50 pozycji na 100, można użyć:

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

To oczywiście nie biorąc pod uwagę strukturę bloku. Jeśli chcesz próbkę 50 artykuł z bloku i na przykład, można zrobić:

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

Można użyć metody sample *:

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 

* Na jednym z DataFrames sekcji.

Uwaga: Jeśli masz większy rozmiar próbki niż rozmiar ramki DataFrame, spowoduje to błąd, chyba że spróbujesz go zastąpić.

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