2012-11-30 14 views
45

मैं पांडा का उपयोग कर स्मृति में लोड होने के लिए सीएसवी की कौन सी रेखाओं को लोड कर सकता हूं? यह एक विकल्प की तरह लगता है कि किसी को read_csv में मिलना चाहिए। क्या मैं कुछ भूल रहा हूँ?मैं पांडस read_csv फ़ंक्शन में लोड पर लाइनों को फ़िल्टर कैसे कर सकता हूं?

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

उत्तर

82

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

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

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

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

+0

'चंक [' दायर '] के लिए> निरंतर' क्या मैं इसे 2 स्थिर मूल्यों के बीच सैंडविच कर सकता हूं? उदा। निरंतर 1> खंड ['फ़ील्ड']> स्थिर 2। या मैं 'श्रेणी में' उपयोग कर सकता हूं? – weefwefwqg3

4

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

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

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

0

यदि आप लिनक्स पर हैं तो आप 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 
संबंधित मुद्दे