2017-01-08 43 views
5

Tôi có một DataFrame mà trông giống như:Sử dụng Pandas để lấy mẫu DataFrame sử dụng trọng lượng của một cột cụ thể của

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

Tôi muốn Pandas để lựa chọn một cách ngẫu nhiên các giá trị, bằng cách sử dụng số lần ra sân trong cột city (loại sử dụng: df.city.value_counts()), do đó kết quả của chức năng kỳ diệu của tôi, giả sử:

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

có thể trông giống như:

0  Yam  Hadera 
    1  Meow  Hadera 
    2  Bond  Tel Aviv 

Cảm ơn! :)

Trả lời

7

Bạn có thể nhóm bởi city và sau đó lấy mẫu từng nhóm dựa trên độ dài của chúng so với chiều dài của khung dữ liệu gốc:

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

enter image description here

+0

Cảm ơn! Cuối cùng, đối với các tập dữ liệu lớn hơn, nó chọn ít hơn giá trị 'N' trong tổng thể (trong ví dụ của bạn, N = 3). Có cách nào để làm điều đó để tôi nhận được chính xác N giá trị trong tổng số? – Infinity

+0

@Infinity Điều gì sẽ xảy ra nếu bạn có 10 nhóm với 2 hàng và N = 3? –

+0

Khi @TedPetrou nhận xét, phương pháp lấy mẫu này có thể không phải lúc nào cũng hoạt động vì bạn chỉ có thể lấy số nguyên của các hàng từ một nhóm, nhưng * tổng số * hàng * có thể phân số. – Psidom

0

Nếu tôi hiểu câu hỏi một cách chính xác, có lẽ bạn đang tìm kiếm 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 
Các vấn đề liên quan