2010-09-27 28 views
17

Tôi muốn sử dụng lệnh tương đương với lệnh con trong R cho một số mã Python mà tôi đang viết.Việc đặt dữ liệu trong Python

Đây là dữ liệu của tôi:

col1 col2 col3 col4 col5 
100002 2006 1.1 0.01 6352 
100002 2006 1.2 0.84 304518 
100002 2006 2 1.52 148219 
100002 2007 1.1 0.01 6292 
10002 2006 1.1 0.01 5968 
10002 2006 1.2 0.25 104318 
10002 2007 1.1 0.01 6800 
10002 2007 4 2.03 25446 
10002 2008 1.1 0.01 6408 

Tôi muốn tập hợp con các dữ liệu dựa trên nội dung của col1col2. (Các giá trị duy nhất trong col1 là 100002 và 10002, và trong col2 là 2006.2007 và 2008.)

Điều này có thể được thực hiện trong R bằng cách sử dụng lệnh tập hợp con, có điều gì tương tự trong Python không?

Trả lời

20

Trong khi câu trả lời lặp dựa trên là hoàn toàn tốt đẹp, nếu bạn đang làm việc với mảng NumPy (như bạn đề cập rằng bạn đang có) có những cách tốt hơn và nhanh hơn các lựa chọn điều:

import numpy as np 
data = np.array([ 
     [100002, 2006, 1.1, 0.01, 6352], 
     [100002, 2006, 1.2, 0.84, 304518], 
     [100002, 2006, 2, 1.52, 148219], 
     [100002, 2007, 1.1, 0.01, 6292], 
     [10002, 2006, 1.1, 0.01, 5968], 
     [10002, 2006, 1.2, 0.25, 104318], 
     [10002, 2007, 1.1, 0.01, 6800], 
     [10002, 2007, 4, 2.03, 25446], 
     [10002, 2008, 1.1, 0.01, 6408] ]) 

subset1 = data[data[:,0] == 100002] 
subset2 = data[data[:,0] == 10002] 

này mang lại

subset1:

array([[ 1.00002e+05, 2.006e+03, 1.10e+00, 1.00e-02, 6.352e+03], 
     [ 1.00002e+05, 2.006e+03, 1.20e+00, 8.40e-01, 3.04518e+05], 
     [ 1.00002e+05, 2.006e+03, 2.00e+00, 1.52e+00, 1.48219e+05], 
     [ 1.00002e+05, 2.007e+03, 1.10e+00, 1.00e-02, 6.292e+03]]) 

subset2:

array([[ 1.0002e+04, 2.006e+03, 1.10e+00, 1.00e-02, 5.968e+03], 
     [ 1.0002e+04, 2.006e+03, 1.20e+00, 2.50e-01, 1.04318e+05], 
     [ 1.0002e+04, 2.007e+03, 1.10e+00, 1.00e-02, 6.800e+03], 
     [ 1.0002e+04, 2.007e+03, 4.00e+00, 2.03e+00, 2.5446e+04], 
     [ 1.0002e+04, 2.008e+03, 1.10e+00, 1.00e-02, 6.408e+03]]) 

Nếu bạn không biết trước các giá trị duy nhất trong cột đầu tiên, bạn có thể sử dụng numpy.unique1d hoặc hàm dựng sẵn set để tìm chúng.

Chỉnh sửa: Tôi chỉ nhận ra rằng bạn muốn chọn dữ liệu mà bạn có sự kết hợp độc đáo của hai cột ... Trong trường hợp đó, bạn có thể làm điều gì đó như thế này:

col1 = data[:,0] 
col2 = data[:,1] 

subsets = {} 
for val1, val2 in itertools.product(np.unique(col1), np.unique(col2)): 
    subset = data[(col1 == val1) & (col2 == val2)] 
    if np.any(subset): 
     subsets[(val1, val2)] = subset 

(Tôi đang lưu trữ các tập con như là một dict, với khóa là một bộ kết hợp ... Có chắc chắn khác (và tốt hơn, tùy thuộc vào những gì bạn đang làm) cách để làm điều này!)

+0

Cảm ơn! Nhìn lại điều này rõ ràng đến nỗi tôi nên tự mình thử nó, nhưng lời giải thích của bạn rất hoàn chỉnh. Tuy nhiên, bạn có biết chúng ta có thể đạt được bao nhiêu tốc độ bằng cách sử dụng phương pháp này so với các vòng lặp không?Tôi nghĩ rằng vòng lặp là khá nhanh quá! – user308827

+0

@ user308827 - Họ đang có, nhưng nếu bạn đang làm việc với các mảng numpy, và không phải danh sách, bằng cách sử dụng một cách numpy làm việc sẽ nhanh hơn. Nói chung, việc lặp lại thông qua một mảng toàn bộ là chậm. Các giải pháp dựa trên Iterator phải lặp qua từng phần tử trong python. Khi bạn chọn một tập hợp con của một mảng numpy bằng cách sử dụng mảng boolean numpy, lặp lại được thực hiện đằng sau hậu trường trong mã được biên dịch. (Tôi quá đơn giản ở đây, nhưng đó là ý chính, dù sao đi nữa). Về cơ bản, nếu bạn đang sử dụng mảng numpy để chứa dữ liệu của bạn, nó nhanh hơn để hoạt động trên chúng với các chức năng numpy. –

+0

Ngoài ra, có cách nào kết hợp 2 điều kiện trong tập hợp con không? Ví dụ: subset1 = data [(dữ liệu [:, 0] == 100002) và (dữ liệu [:, 1] == 2007)] dường như không hoạt động. cảm ơn! – user308827

2

Vì tôi không quen thuộc với R cũng như cách lệnh tập hợp con này hoạt động dựa trên mô tả của bạn, tôi có thể đề nghị bạn xem xét chức năng nhóm của itertool. Nếu đưa ra một hàm xuất ra một giá trị, bạn có thể tạo nhóm dựa trên đầu ra của hàm đó. Lấy từ groupby:

groups = [] 
uniquekeys = [] 
data = sorted(data, key=keyfunc) 
for k, g in groupby(data, keyfunc): 
    groups.append(list(g))  # Store group iterator as a list 
    uniquekeys.append(k) 

và sau đó bạn đã có tập con của mình. Tuy nhiên, hãy cẩn thận vì các giá trị được trả lại không phải là danh sách đầy đủ. Họ là người lặp.

Tôi giả định rằng các giá trị của bạn đang được trả về theo từng hàng.

+0

Cảm ơn! Điều này rất hữu ích. – user308827

5

subset() trong R khá giống với filter() bằng Python. Như các ghi chú tài liệu tham khảo, điều này sẽ được sử dụng mặc nhiên bởi comprehensions danh sách, vì vậy cách ngắn gọn và rõ ràng nhất để viết mã có thể là

[ item for item in items if item.col2 == 2006 ] 

nếu, ví dụ, hàng dữ liệu của bạn đang ở trong một iterable gọi items.

+0

Cảm ơn! Tôi sẽ thêm bộ lọc vào danh sách các lệnh để ghi nhớ – user308827

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