Lựa chọn hàng ngẫu nhiên trong khung dữ liệu Pandas


159

Có cách nào để chọn các hàng ngẫu nhiên từ DataFrame trong Pandas.

Trong R, sử dụng gói ô tô, có một chức năng hữu ích some(x, n)tương tự như đầu nhưng chọn, trong ví dụ này, 10 hàng ngẫu nhiên từ x.

Tôi cũng đã xem tài liệu cắt lát và dường như không có gì tương đương.

Cập nhật

Bây giờ sử dụng phiên bản 20. Có một phương pháp mẫu.

df.sample(n)


1
Nếu bạn đang tìm kiếm mẫu ở nơi kích thước lớn hơn bản gốc, hãy sử dụng df.sample(N, replace=True). Thêm chi tiết tại đây .
cs95

Câu trả lời:


57

Một cái gì đó như thế này?

import random

def some(x, n):
    return x.ix[random.sample(x.index, n)]

Lưu ý: Tính đến Pandas v0.20.0, ix đã bị phản đối ủng hộ loccho nhãn lập chỉ mục dựa.


8
Cảm ơn @eumiro. Tôi cũng làm việc mà df.ix[np.random.random_integers(0, len(df), 10)]cũng sẽ làm việc.
John

7
Nếu bạn muốn sử dụng numpy, thì bạn cũng có thể làm df.ix[np.random.choice(df.index, 10)].
ness101

7
Một người nào đó trong một bài đăng khác đã đề cập rằng np.random.choicenhanh gấp đôirandom.sample
Phani

5
Nếu bạn sử dụng np.random.choice, bạn phải chỉ định thay thế = Sai, nếu không, bạn sẽ nhận được các hàng trùng lặp!
stmax

2
Tôi nghĩ ".ix" không được dùng nữa và bạn nên sử dụng .loc để lập chỉ mục dựa trên nhãn
compguy24

266

Với phiên bản gấu trúc 0.16.1trở lên, giờ đây đã có một DataFrame.sample phương thức tích hợp :

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)

Đối với một trong hai cách tiếp cận ở trên, bạn có thể lấy các hàng còn lại bằng cách thực hiện:

df_rest = df.loc[~df.index.isin(df_percent.index)]

df_0.7không phải là một tên hợp lệ. Hơn nữa, tôi đề nghị thay thế df_rest = df.loc[~df.index.isin(df_0_7.index)]bằng df_rest = df.loc[df.index.difference(df_0_7.index)].
Pietro Battiston

@PietroBattiston Cảm ơn. Tôi đã cố gắng làm cho câu trả lời rõ ràng hơn, nhưng tôi đồng ý một ví dụ không hoạt động là không rõ ràng. Đẹp với mẹo về sự khác biệt. Mặc dù vậy, tôi vẫn thích viết phần cắt để tôi đọc nó dưới dạng chỉ số "không có trong chỉ mục mẫu của tôi". Có tăng hiệu suất với difference()?
ryanjdillon

1
@ryanjdillon có một lỗi đánh máy còn lại, tôi đã sửa nó. Liên quan đến phương pháp, tôi thực sự lấy lại đề xuất của mình, vì thực sự nó kém hiệu quả hơn một chút. df_percent.index.get_indexer(df.index) == -1thay vào đó là hiệu quả hơn nhiều (nhưng cũng xấu hơn) ...
Pietro Battiston

18

sample

Kể từ v0.20.0, bạn có thể sử dụng pd.DataFrame.sample, có thể được sử dụng để trả về một mẫu ngẫu nhiên của một hàng số cố định hoặc tỷ lệ phần trăm của các hàng:

df = df.sample(n=k)     # k rows
df = df.sample(frac=k)  # int(len(df.index) * k) rows

Đối với độ tái lập, bạn có thể chỉ định một số nguyên random_state, tương đương với việc sử dụng np.ramdom.seed. Vì vậy, thay vì cài đặt, ví dụ np.random.seed = 0, bạn có thể:

df = df.sample(n=k, random_state=0)

7

Cách tốt nhất để làm điều này là với hàm mẫu từ mô-đun ngẫu nhiên,

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

Trên thực tế điều này sẽ cung cấp cho bạn các chỉ số lặp đi lặp lại np.random.random_integers(0, len(df), N)trong đó Nmột số lượng lớn.


3

Dòng bên dưới sẽ chọn ngẫu nhiên n số hàng trong tổng số hàng hiện có từ df dataframe mà không thay thế.

df=df.take(np.random.permutation(len(df))[:n])

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.