2011-12-24 18 views
7

Việc hiểu danh sách rất tốt. Nhưng một số loại "... Tham gia ..." sẽ rất hữu ích. Cảm ơn. Ví dụ như vậy. Tôi có một bộ A = {1,0}, một danh sách B = [[1,1], [2,3]]. Tôi muốn tìm tất cả các hàng trong B, nơi colomu thứ hai là một trong các giá trị trong A. Hoặc một số điều tổng quát hơn, tôi có 2 tệp CSV. Tôi muốn tìm hiểu tất cả các hàng mà các giá trị của một số dấu hai chấm từ hai tập tin phù hợp. Cũng giống như một số loại 'tham gia' của hai tập tin. Một trong các tệp là kích thước GB. sqldf is "SQL select on R data frames."Có một mô-đun trong Python thực hiện điều gì đó như "sqldf" cho R?

+3

Bạn sẽ nhận được nhiều hơn/câu trả lời tốt hơn nếu bạn có một ngắn gọn tóm tắt về những gì 'sqldf' làm cho người dùng không phải R. Chính xác những phần chức năng của nó mà bạn muốn? –

+1

Đồng ý ... Ngoài ra, một số mã hoặc ít nhất một số mã giả để giải thích những gì bạn đang cố gắng làm sẽ hữu ích. –

Trả lời

4

tôi không biết gì về một thư viện làm những gì bạn yêu cầu (nhưng tôi chỉ liếc nhìn tài liệu sqldf) Tuy nhiên không có gì về những gì bạn hỏi thực sự đòi hỏi một thư viện, họ là một lớp lót trong python (và bạn có thể tất nhiên là trừu tượng chức năng tạo ra một chức năng hơn là một sự hiểu biết danh sách đơn giản ...)

Đặt A = {1,0}, danh sách B = [[1,1], [2,3]] . Tôi muốn tìm tất cả các hàng trong B nơi cột thứ hai là một trong những giá trị trong A.

>>> a = set([1, 0]) 
>>> b = [[1,1],[2,3]] 
>>> [l for l in b if l[1] in a] 
[[1, 1]] 

Tôi có 2 file CSV. Tôi muốn tìm hiểu tất cả các hàng trong đó các giá trị của một số cột từ hai tệp phù hợp.

>>> f1 = [[1, 2, 3], [4, 5, 6]] 
>>> f2 = [[0, 2, 8], [7, 7, 7]] 
>>> [tuple_ for tuple_ in zip(f1, f2) if tuple_[0][1] == tuple_[1][1]] 
[([1, 2, 3], [0, 2, 8])] 

EDIT: Nếu sử dụng bộ nhớ là một vấn đề, bạn nên sử dụng máy phát điện thay vì danh sách. Ví dụ:

>>> zip(f1, f2) 
[([1, 2, 3], [0, 2, 8]), ([4, 5, 6], [7, 7, 7])] 

nhưng sử dụng máy phát điện:

>>> import itertools as it 
>>> gen = it.izip(f1, f2) 
>>> gen 
<itertools.izip object at 0x1f24ab8> 
>>> next(gen) 
([1, 2, 3], [0, 2, 8]) 
>>> next(gen) 
([4, 5, 6], [7, 7, 7]) 

Và đối với các nguồn dữ liệu:

>>> [line for line in f1] 
[[1, 2, 3], [4, 5, 6]] 

dịch như phát như:

>>> gen = (line for line in f1) 
>>> gen 
<generator object <genexpr> at 0x1f159b0> 
>>> next(gen) 
[1, 2, 3] 
>>> next(gen) 
[4, 5, 6] 
+0

Cảm ơn @mac. Bạn nói đúng, việc hiểu danh sách tương tự như SQL, nếu bạn không xử lý các tệp lớn không thể đọc được trong bộ nhớ một lần. Tôi sẽ rất vui nếu tôi làm như vậy với các tệp CSV lớn. – gstar2002

+0

@ gstar2002 - Không có gì ngăn cản bạn sử dụng cú pháp này với các trình tạo thay vì danh sách. Xem chỉnh sửa. – mac

+0

cảm ơn, nó hoạt động cho izip. Nhưng đối với những thứ như ([l1, l2] đối với l1 trong f1 cho l2 trong f2), nó không hoạt động. Tôi chỉ nhận được dòng đầu tiên của f1 kết hợp với tất cả các dòng từ f2. Nhưng tôi muốn có tất cả các kết hợp. – gstar2002

1

Trước khi bạn có thể làm các chức năng của sqldf bạn cần func tionality của 'df', tức là dataframes. Python có một phiên bản nâng niu: gấu trúc:

http://pandas.sourceforge.net/

Có lẽ phần tham gia và sáp nhập sẽ giúp:

http://pandas.sourceforge.net/merging.html

tôi khuyên bạn nên bắt đầu với một cái gì đó nhỏ hơn file gigabyte của bạn mặc dù!

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