Как мне объединить большие CSV-файлы в Python? - PullRequest
0 голосов
/ 07 июня 2019

У меня есть 18 CSV-файлов, каждый примерно по 1,6 ГБ, и каждый содержит примерно 12 миллионов строк.Каждый файл представляет данные за один год.Мне нужно объединить все эти файлы, извлечь данные для определенных географических регионов, а затем проанализировать временные ряды.Каков наилучший способ сделать это?

Я устал от использования pd.read_csv, но я достиг предела памяти.Я попытался включить аргумент размера куска, но это дает мне объект TextFileReader, и я не знаю, как объединить их, чтобы создать кадр данных.Я также пробовал pd.concat, но это тоже не работает.

Ответы [ 2 ]

3 голосов
/ 07 июня 2019

Ограничение памяти достигнуто, потому что вы пытаетесь загрузить весь CSV в память.Простым решением было бы читать файлы построчно (при условии, что все ваши файлы имеют одинаковую структуру), управлять им, а затем записывать его в целевой файл:

filenames = ["file1.csv", "file2.csv", "file3.csv"]
sep = ";"

def check_data(data):
    # ... your tests
    return True # << True if data should be written into target file, else False

with open("/path/to/dir/result.csv", "a+") as targetfile:
    for filename in filenames :
        with open("/path/to/dir/"+filename, "r") as f:
            next(f) # << only if the first line contains headers
            for line in f:
                data = line.split(sep)
                if check_data(data):
                    targetfile.write(line)

Обновление : Пример метода check_data, следующий за вашими комментариями:

def check_data(data):
    return data[n] == 'USA' # < where n is the column holding the country
1 голос
/ 07 июня 2019

Вы можете преобразовать объект TextFileReader, используя pd.DataFrame примерно так: df = pd.DataFrame(chunk), где chunk имеет тип TextFileReader.Затем вы можете использовать pd.concat для объединения отдельных фреймов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...