2017-01-08 61 views
5

Mam DataFrame który wygląda tak:Korzystanie Pandy próbki DataFrame użyciu wagi określonej kolumny za

index name city 
    0  Yam Hadera 
    1  Meow Hadera 
    2  Don Hadera 
    3  Jazz Hadera 
    4  Bond Tel Aviv 
    5  James Tel Aviv 

chcę Pandy losowo wybierać wartości, używając liczby występów w kolumnie city (niby za pomocą: df.city.value_counts()), więc wyniki mojej funkcji magicznego, załóżmy:

df.magic_sample(3, weight_column='city') 

może wyglądać następująco:

0  Yam  Hadera 
    1  Meow  Hadera 
    2  Bond  Tel Aviv 

Dzięki! :)

Odpowiedz

7

Można grupa przez city a następnie próbki każdej grupy w oparciu o ich długość w porównaniu do długości pierwotnej ramki danych:

df.groupby('city', group_keys=False).apply(lambda g: g.sample(3 * len(g)/len(df))) 

enter image description here

+0

Dzięki! Ostatecznie, dla większych zestawów danych, wybiera mniej niż wartości "N" w ogólnym (w twoim przykładzie, N = 3). Czy istnieje sposób, aby to zrobić, aby uzyskać dokładnie N wartości w sumie? – Infinity

+0

@Infinity Co by się stało, gdybyś miał 10 grup z 2 rzędami i N = 3? –

+0

Jak skomentował @TedPetrou, ta metoda próbkowania nie zawsze działa, ponieważ można tylko próbkować całkowitą liczbę wierszy z grupy, ale * waga * całkowita liczba wierszy * może być ułamkowa. – Psidom

0

Jeśli dobrze rozumiem pytanie, może szukasz random.sample:

>>> import pandas as pd 
>>> from random import sample 
>>> df = pd.DataFrame(data=[('Yam', 'Hadera'), ('Meow', 'Hadera'), ('Don', 'Hadera'), ('Jazz', 'Hadera'), ('Bond', 'Tel Aviv'), ('James', 'Tel Aviv')], columns=('name', 'city')) 
>>> df 
    name  city 
0 Yam Hadera 
1 Meow Hadera 
2 Don Hadera 
3 Jazz Hadera 
4 Bond Tel Aviv 
5 James Tel Aviv 
>>> df.iloc[sample(range(len(df)), 3), :] 
    name  city 
4 Bond Tel Aviv 
0 Yam Hadera 
1 Meow Hadera