मैं पंडों read_csv फ़ंक्शन में लोड पर लाइनों को कैसे फ़िल्टर कर सकता हूं?


94

मैं कैसे एक CSV की पंक्तियों को पांडा की मदद से मेमोरी में लोड कर सकता हूं? यह एक विकल्प की तरह लगता है जिसे किसी को ढूंढना चाहिएread_csv । क्या मैं कुछ भूल रहा हूँ?

उदाहरण: हमने एक टाइमस्टैम्प कॉलम के साथ एक CSV किया है और हम दी गई लाइनों को लोड करना चाहेंगे जो टाइमस्टैम्प के साथ दिए गए स्थिरांक से अधिक है।

जवाबों:


163

CSV फ़ाइल को पांडा ऑब्जेक्ट में लोड करने से पहले पंक्तियों को फ़िल्टर करने का विकल्प नहीं है।

आप या तो फ़ाइल को लोड कर सकते हैं और फिर फ़िल्टर का उपयोग कर सकते हैं df[df['field'] > constant], या यदि आपके पास बहुत बड़ी फ़ाइल है और आप मेमोरी को चलाने के बारे में चिंतित हैं, तो एक इटरेटर का उपयोग करें और फ़िल्टर को लागू करें जैसे कि आप अपनी फ़ाइल का हिस्सा बदलते हैं:

import pandas as pd
iter_csv = pd.read_csv('file.csv', iterator=True, chunksize=1000)
df = pd.concat([chunk[chunk['field'] > constant] for chunk in iter_csv])

आप chunksizeअपनी उपलब्ध स्मृति के अनुरूप भिन्न हो सकते हैं । अधिक जानकारी के लिए यहां देखें ।


के लिए chunk['filed']>constantमैं इसे 2 निरंतर मूल्यों के बीच सैंडविच कर सकते हैं? उदा: स्थिरांक> चंक ['क्षेत्र'] स्थिरांक २। या मैं 'रेंज में' का उपयोग कर सकता हूं?
weefwefwqg3

कोशिश करें:chunk[(chunk['field'] > constant2)&(chunk['field']<constant1)]
जोहान्स वाक्स

क्या यह याद आ रही है .loc? chunk.loc[chunk['field'] > constant]
विंसेंट

1
आप के साथ या बिना बूलियन मास्क का उपयोग कर सकते हैं .loc। मुझे नहीं लगता कि .loc2012 में वापस अस्तित्व में आया था, लेकिन मुझे लगता है कि इन दिनों का उपयोग .locकरना थोड़ा अधिक स्पष्ट है।
मैटी जॉन

8

मुझे इसके संदर्भ में ऐसा करने का सीधा-सीधा तरीका नहीं मिला read_csv। हालाँकि, read_csvडेटाफ़्रेम लौटाता है, जिसे बूलियन वेक्टर द्वारा पंक्तियों का चयन करके फ़िल्टर किया जा सकता है df[bool_vec]:

filtered = df[(df['timestamp'] > targettime)]

यह df में सभी पंक्तियों का चयन कर रहा है (यह मानते हुए कि df कोई डेटाफ़्रेम है, जैसे किसी read_csvकॉल का परिणाम , जिसमें कम से कम एक डेटाटाइम कॉलम होता है timestamp) जिसके लिए timestampस्तंभ में मान लक्ष्य समय के मान से अधिक हैं। इसी तरह का सवाल


1
मैं इस बारे में निश्चित नहीं हूं, लेकिन मुझे लगता है कि यह स्मृति उपयोग पर भारी होगा।
नाथन

2

यदि फ़िल्टर की गई सीमा सन्निहित है (जैसा कि आमतौर पर समय (स्टाम्प) फिल्टर के साथ होता है), तो सबसे तेज़ समाधान पंक्तियों की श्रेणी को हार्ड-कोड करना है। बस मापदंडों के skiprows=range(1, start_row)साथ गठबंधन nrows=end_row। फिर आयात सेकंड लेता है जहां स्वीकृत समाधान में मिनट लगेंगे। प्रारंभिक के साथ कुछ प्रयोग start_rowआयात समय पर बचत को देखते हुए बहुत बड़ी लागत नहीं हैं। ध्यान दें कि हमने हेडर पंक्ति का उपयोग करके रखा है range(1,..)


-3

यदि आप linux पर हैं तो आप grep का उपयोग कर सकते हैं।

# to import either on Python2 or Python3
import pandas as pd
from time import time # not needed just for timing
try:
    from StringIO import StringIO
except ImportError:
    from io import StringIO


def zgrep_data(f, string):
    '''grep multiple items f is filepath, string is what you are filtering for'''

    grep = 'grep' # change to zgrep for gzipped files
    print('{} for {} from {}'.format(grep,string,f))
    start_time = time()
    if string == '':
        out = subprocess.check_output([grep, string, f])
        grep_data = StringIO(out)
        data = pd.read_csv(grep_data, sep=',', header=0)

    else:
        # read only the first row to get the columns. May need to change depending on 
        # how the data is stored
        columns = pd.read_csv(f, sep=',', nrows=1, header=None).values.tolist()[0]    

        out = subprocess.check_output([grep, string, f])
        grep_data = StringIO(out)

        data = pd.read_csv(grep_data, sep=',', names=columns, header=None)

    print('{} finished for {} - {} seconds'.format(grep,f,time()-start_time))
    return data

1
कई कारणों से ग्रीप का उपयोग करना गंभीर रूप से बुरा विकल्प है। 1) यह धीमी गति से 2 है) यह पोर्टेबल नहीं है 3) यह पांडा या अजगर नहीं है (आप अजगर के अंदर नियमित अभिव्यक्ति का उपयोग कर सकते हैं) यही कारण है कि मैंने आपके जवाब को अस्वीकार कर दिया है
अहमद मसूद

आपका समाधान सभी प्लेटफार्मों पर काम नहीं करता है और इसमें ग्रीप भी शामिल है। यही पतन का कारण है।
रोमन ओरक

-3

आप nrowsपैरामीटर निर्दिष्ट कर सकते हैं ।

import pandas as pd df = pd.read_csv('file.csv', nrows=100)

यह कोड 0.20.3 संस्करण में अच्छी तरह से काम करता है।


1
ओपी पूछ रहा है कि फ़िल्टर कैसे पढ़ें लाइनों की संख्या को सीमित नहीं करें। यही कारण है कि मैंने आपके उत्तर को अस्वीकार कर दिया।
रोमन ओरक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.