Чтение нескольких файлов CSV в Pandas порциями - PullRequest
0 голосов
/ 04 марта 2019

Как импортировать и читать несколько CSV-блоков, когда у нас есть несколько CSV-файлов и общий размер всех CSV составляет около 20 ГБ?

Я не хочу использовать Spark, как я хочу использоватьмодель в SkLearn, поэтому я хочу решение в самой Pandas.

Мой код:

allFiles = glob.glob(os.path.join(path, "*.csv"))
df = pd.concat((pd.read_csv(f,sep=",") for f in allFiles))
df.reset_index(drop=True, inplace=True)

Но это не удается, так как общий размер всех CSV на моем пути составляет 17 ГБ.

Я хочу прочитать его кусками, но я получаю сообщение об ошибке, если пытаюсь сделать следующее:

  allFiles = glob.glob(os.path.join(path, "*.csv"))
  df = pd.concat((pd.read_csv(f,sep=",",chunksize=10000) for f in allFiles))
  df.reset_index(drop=True, inplace=True)

Я получаю следующую ошибку:

"невозможно объединить объект типа" "; допустимы только объекты pd.Series, pd.DataFrame и pd.Panel (не рекомендуется)"

Может кто-нибудь помочь?

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Это интересный вопрос.Я не пробовал этого, но я думаю, что код будет выглядеть примерно так, как показано ниже:

import pandas as pd
import csv
import glob
import os

#os.chdir("C:\\your_path\\")
results = pd.DataFrame([])
filelist = glob.glob("C:\\your_path\\*.csv")
#dfList=[]
for filename in filelist:
    print(filename)  
    namedf = pd.read_csv(filename, skiprows=0, index_col=0)
    results = results.append(namedf)

results.to_csv('C:\\your_path\\Combinefile.csv')


chunksize = 10 ** 6
for chunk in pd.read_csv('C:\\your_path\\Combinefile.csv', chunksize=chunksize):
    process(chunk)

Может быть, вы могли бы загрузить все в память и обработать ее напрямую, но это, вероятно, потребовало бы намного больше времени дляобрабатывать все.

0 голосов
/ 04 марта 2019

, чтобы прочитать большой CSV-файл, вы можете использовать chunksize, но в этом случае вы должны использовать итератор следующим образом:

for df in pd.read_csv('file.csv', sep=',', iterator=True, chunksize=10000):
    process(df)

вам нужно объединить или добавить каждый блок

или выможет сделать это:

df = pd.read_csv('file.csv',, sep=',', iterator=True, chunksize=10000)
for chunk in df:
    process(chunk)

для чтения нескольких файлов: например,

listfile = ['file1,'file2]
dfx = pd.DataFrame()
def process(d):
    #dfx=dfx.append(d) or dfx = pd.concat(dfx, d)
    #other coding

for f in listfile:
    for df in pd.read_csv(f, sep=',', iterator=True, chunksize=10000):
        process(df)

после того, как у вас есть много файлов, вы можете использовать DASK или Pool из многопроцессорной библиотеки для запуска процесса чтения.

В любом случае, либо у вас достаточно памяти, либо вы теряете время

...