Фильтрация строк фрейма данных при чтении в CSV с многопроцессорной обработкой - PullRequest
0 голосов
/ 04 августа 2020

Есть ли способ проанализировать данные из CSV перед загрузкой в ​​RAM? В настоящее время я загружаю все данные, объединяю их, а затем выбираю нужные мне строки. Было бы быстрее выбрать мои строки для каждого файла перед объединением?

Вот мой код для загрузки df:

import pandas as pd 
import time
from multiprocessing import Pool

def my_read_csv(filename):
    return pd.read_csv(filename)

def load_csv():
    path = *my path**
    listOfFiles = glob.glob(os.path.join(path, "*_T100D_*.csv"))
    
    print('Beginning to combine df')
    print('...working...')
    start_time = time.time()
    
    with Pool(processes=8) as pool:
        df_list = pool.map(my_read_csv, listOfFiles)
       
    df = pd.concat(df_list, ignore_index=True, sort=True)
    print("Pooled process took", time.time() - start_time, " seconds to run")
    
    return df

В df есть два столбца: YEAR и ORIGIN. Как я могу разобрать его так, чтобы в df считывались только df.YEAR >= 2004 и df.isin(['LAX', 'JFK'])?

1 Ответ

0 голосов
/ 04 августа 2020

Вы можете попробовать dask сначала отфильтровать данные, а затем преобразовать их в pandas фрейм данных. Я создал два образца файла .csv для успешного тестирования, но дайте мне знать, как это работает для вас. Я также удалил многопроцессорный код, так как он может вам не понадобиться с dask.

import dask.dataframe as dd #try using dask
import glob
import os
import pandas as pd 
import time

def load_csv():
    path = r'Desktop/'
    listOfFiles = glob.glob(f'{path}*_T100D_*.csv')
    print('...working...')
    start_time = time.time()
    df = dd.concat([dd.read_csv(f) for f in listOfFiles]) #changed pd to dd
    print("Process took", time.time() - start_time, " seconds to run")
    df = df[(df.YEAR >= 2004) & (df.ORIGIN.isin(['LAX', 'JFK']))].compute() #filter for rows and compute as pandas dataframe
    return df


load_csv()
...working...
Pooled process took 0.01399993896484375  seconds to run
Out[25]: 
   YEAR ORIGIN
3  2004    JFK
6  2007    LAX
0  2008    LAX
2  2010    LAX
3  2011    JFK
6  2014    LAX
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...