2011-12-24 6 views
7

सूची समझ बहुत अच्छी हैं। लेकिन किसी तरह का "... शामिल हों ..." बहुत उपयोगी होगा। धन्यवाद। तो उदाहरण के लिए। मेरे पास एक सेट ए = {1,0} है, एक सूची बी = [[1,1], [2,3]]। मैं बी में सभी पंक्तियां खोजना चाहता हूं जहां दूसरा कोलोम ए में मानों में से एक है या कुछ और सामान्य है, मेरे पास 2 सीएसवी फाइलें हैं। मैं उन सभी पंक्तियों को जानना चाहता हूं जहां दो फाइलों से कुछ कॉलोनम के मूल्य मेल खाते हैं। बस दो फाइलों के 'प्रकार' की तरह। फाइलों में से एक जीबी आकार है। sqldf is "SQL select on R data frames."क्या पाइथन में कोई मॉड्यूल है जो आर के लिए "sqldf" जैसा कुछ करता है?

+3

आप अधिक/बेहतर जवाब पाने होगा यदि आप एक संक्षिप्त है गैर-आर उपयोगकर्ताओं के लिए 'sqldf' क्या करता है इसका सारांश। वास्तव में आप इसकी कार्यक्षमता के कौन से हिस्से चाहते हैं? –

+1

सहमत ... इसके अलावा, कुछ कोड या कम से कम कुछ छद्म कोड जो आप करने की कोशिश कर रहे हैं उसे समझाने में मददगार होगा। –

उत्तर

4

मैं तुम्हें क्या पूछना (लेकिन मैं केवल sqldf प्रलेखन पर नजर) कर रही है, लेकिन आप क्या पूछा के लिए कुछ भी नहीं सच में एक पुस्तकालय, वे अजगर में एक-लाइनर्स हैं की आवश्यकता है एक पुस्तकालय से अनभिज्ञ हूं (और आप कर सकते थे निश्चित रूप से सरल सूची समझ के बजाए एक फ़ंक्शन बनाने की कार्यक्षमता ...)

ए = {1,0} सेट करें, एक सूची बी = [[1,1], [2,3]] । मैं बी में सभी पंक्तियों को प्राप्त करना चाहते हैं जहां दूसरे स्तंभ ए

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

में मूल्यों में से एक है मैं 2 CSV फ़ाइलों के लिए होगा। मैं उन सभी पंक्तियों को ढूंढना चाहता हूं जहां दो फाइलों से कुछ कॉलम के मान मिलते हैं।

>>> 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])] 

संपादित करें: स्मृति उपयोग एक समस्या है यदि आप सूचियों के बजाय जनरेटर का उपयोग करना चाहिए।

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

लेकिन का उपयोग कर जनरेटर:

>>> 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]) 

और डेटा स्रोत के लिए उदाहरण के लिए:

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

के रूप में जनरेटर के रूप में अनुवाद करें:

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

धन्यवाद @ एमएसी। आप सही हैं, सूची समझ एसक्यूएल के समान ही शक्तिशाली है, अगर आप उन बड़ी फ़ाइलों से निपट नहीं रहे हैं जिन्हें एक बार स्मृति में पढ़ा नहीं जा सकता है। अगर मैं बड़ी सीएसवी फाइलों के साथ ऐसा करता हूं तो मैं बहुत खुश हूं। – gstar2002

+0

@ gstar2002 - सूचियों के बजाय जनरेटर के साथ इस वाक्यविन्यास का उपयोग करने से आपको कुछ भी नहीं रोक रहा है। संपादन देखें। – mac

+0

धन्यवाद, यह izip के लिए काम करता है। लेकिन f2 में l2 के लिए f1 में l1 के लिए ([l1, l2] जैसी चीजों के लिए), यह काम नहीं करता है। मुझे केवल एफ 2 की सभी पंक्तियों के साथ संयुक्त रूप से एफ 1 की पहली पंक्ति मिलती है। लेकिन मैं सभी संयोजनों को देखना चाहता हूं। – gstar2002

1

आप कर सकते हैं इससे पहले कि sqldf की कार्यक्षमता आपको func की आवश्यकता है 'डीएफ' की tionality, यानी डेटा फ्रेम। अजगर एक cuddly संस्करण है: पांडा:

http://pandas.sourceforge.net/

शायद में शामिल होने और विलय में मदद मिलेगी पर अनुभाग:

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

मैं सुझाव है कि आप अपने गीगाबाइट फ़ाइलों हालांकि तुलना में छोटे कुछ के साथ शुरू!

5

आप पांडास्क्ल का उपयोग कर सकते हैं, जो पांडा डेटाफ्रेम के एसक्यूएल स्टाइल पूछताछ के लिए अनुमति देता है। यह sqldf के समान है।

https://github.com/yhat/pandasql/

(पूर्ण त्याग, मैं इसे लिखा था)

संपादित करें: ब्लॉग पोस्ट सुविधाओं में से कुछ यहां पाया दस्तावेजीकरण: http://blog.yhathq.com/posts/pandasql-sql-for-pandas-dataframes.html