2012-08-30 53 views
62

Tôi đang cố gắng đọc một tệp CSV khá lớn với Pandas và chia thành hai phần ngẫu nhiên, một trong số đó là 10% dữ liệu và phần còn lại là 90%.Pandas: Lấy mẫu DataFrame

Dưới đây là nỗ lực hiện tại của tôi:

rows = data.index 
row_count = len(rows) 
random.shuffle(list(rows)) 

data.reindex(rows) 

training_data = data[row_count // 10:] 
testing_data = data[:row_count // 10] 

Đối với một số lý do, sklearn ném lỗi này khi tôi cố gắng sử dụng một trong các đối tượng này DataFrame kết quả bên trong của một bộ phân loại SVM:

IndexError: each subindex must be either a slice, an integer, Ellipsis, or newaxis 

Tôi nghĩ Tôi đang làm sai. Có cách nào tốt hơn để làm điều này?

+3

Ngẫu nhiên, điều này sẽ không xáo trộn ngẫu nhiên một cách chính xác anyway - vấn đề là 'random.shuffle (danh sách (hàng)) ' . 'shuffle' thay đổi dữ liệu mà nó hoạt động, nhưng khi bạn gọi' list (rows) ', bạn tạo một bản sao của' rows' được thay đổi và sau đó bị vứt bỏ - chuỗi gấu trúc bên dưới, 'rows', không thay đổi. Một giải pháp là gọi 'rows = list (rows)', sau đó là 'random.shuffle (rows)' và 'data.reindex (rows)' sau đó. –

Trả lời

76

Bạn đang sử dụng phiên bản gấu trúc nào? Đối với tôi mã của bạn hoạt động tốt (i `m trên git master).

cách tiếp cận khác có thể là:

In [117]: import pandas 

In [118]: import random 

In [119]: df = pandas.DataFrame(np.random.randn(100, 4), columns=list('ABCD')) 

In [120]: rows = random.sample(df.index, 10) 

In [121]: df_10 = df.ix[rows] 

In [122]: df_90 = df.drop(rows) 

Mới hơn phiên bản (từ 0.16.1 trên) hỗ trợ này trực tiếp: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sample.html

+7

Cách tiếp cận khác là sử dụng 'np.random.permuation' –

+1

@WesMcKinney: Tôi nhận thấy rằng' np.random.permutation' sẽ loại bỏ các tên cột khỏi DataFrame, vì 'np.random.permutation'. Có một phương pháp trong gấu trúc sẽ shuffle các dataframe trong khi giữ lại các tên cột? – hlin117

+4

@hlin df.loc [np.random.permutation (df.index)] sẽ xáo trộn khung dữ liệu và giữ tên cột. –

77

Tôi đã phát hiện ra rằng np.random.choice() mới trong NumPy 1.7.0 công trình khá tốt cho điều này.

Ví dụ: bạn có thể chuyển giá trị chỉ mục từ một DataFrame và số nguyên 10 để chọn 10 hàng được lấy mẫu ngẫu nhiên thống nhất.

rows = np.random.choice(df.index.values, 10) 
sampled_df = df.ix[rows] 
+0

với thời gian ipython phải mất một nửa thời gian 'random.sample' .. tuyệt vời – gc5

+0

+1 để sử dụng np.random.choice. Ngoài ra, nếu bạn có một 'pd.Series' của xác suất,' prob', bạn có thể chọn từ chỉ mục như sau: 'np.random.choice (prob.index.values, p = prob.values)' – LondonRob

+37

Don ' t quên chỉ định thay thế = Sai nếu bạn muốn lấy mẫu mà không cần thay thế.Nếu không, phương thức này có khả năng lấy mẫu cùng một hàng nhiều lần. –

13

Pandas 0.16.1 có phương thức sample cho điều đó.

+0

Tuyệt vời! Nhưng bạn vẫn phải tải tất cả dữ liệu trong bộ nhớ, phải không? – Nikolay

+0

Tôi làm điều đó sau khi tải dữ liệu trong bộ nhớ. – hurrial

17

mới trong phiên bản 0.16.1:

sample_dataframe = your_dataframe.sample(n=how_many_rows_you_want) 

doc ở đây: http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.sample.html

+0

Khi bạn đã có sample_dataframe, làm thế nào để bạn trừ nó khỏi your_dataframe? –

+0

@ChrisNielsen Bạn có yêu cầu để bạn có thể thực hiện xác thực chéo không? Nếu vậy, tôi khuyên bạn nên http://scikit-learn.org/stable/modules/cross_validation.html vì nó cung cấp cho bạn tất cả các tập dữ liệu đào tạo và thử nghiệm của bạn (trực tiếp X_train, X_test, y_train, y_test) – dval

Các vấn đề liên quan