pandas groupby для нескольких кадров / файлов данных одновременно

У меня есть несколько огромных файлов TSV, которые я пытаюсь обрабатывать с помощью pandas. Я хочу группировать «col3» и «col5». Я пробовал это:

import pandas as pd df = pd.read_csv('filename.txt', sep = "\t") g2 = df.drop_duplicates(['col3', 'col5']) g3 = g2.groupby(['col3', 'col5']).size().sum(level=0) print g3 

До сих пор он отлично работает и печатает вывод следующим образом:

 yes 2 no 2 

Я хотел бы иметь возможность объединять выходные данные из нескольких файлов, т. Е. Иметь возможность группировать эти два столбца во всех файлах одновременно и печатать один общий вывод с общим количеством вхождений «да» или «нет», или каким бы то ни было этим атрибутом. Другими словами, теперь я хотел бы использовать groupby для нескольких файлов одновременно. И если в файле нет одного из этих столбцов, он должен быть пропущен и должен перейти к следующему файлу.

Это хороший вариант использования для blaze .

Ниже приведен пример использования нескольких сокращенных файлов из набора данных nyctaxi . Я намеренно разбил один большой файл на два файла по 1 000 000 строк каждый:

 In [16]: from blaze import Data, compute, by In [17]: ls trip10.csv trip11.csv In [18]: d = Data('*.csv') In [19]: expr = by(d[['passenger_count', 'medallion']], avg_time=d.trip_time_in_secs.mean()) In [20]: %time result = compute(expr) CPU times: user 3.22 s, sys: 393 ms, total: 3.61 s Wall time: 3.6 s In [21]: !du -h * 194M trip10.csv 192M trip11.csv In [22]: len(d) Out[22]: 2000000 In [23]: result.head() Out[23]: passenger_count medallion avg_time 0 0 08538606A68B9A44756733917323CE4B 0 1 0 0BB9A21E40969D85C11E68A12FAD8DDA 15 2 0 9280082BB6EC79247F47EB181181D1A4 0 3 0 9F4C63E44A6C97DE0EF88E537954FC33 0 4 0 B9182BF4BE3E50250D3EAB3FD790D1C9 14 

Примечание. Это будет выполнять вычисления с помощью pandas, используя собственный punkas-считыватель CSV. Если ваши файлы находятся в диапазоне GB, вам лучше конвертировать в формат, такой как bcolz или PyTables , поскольку они являются двоичными форматами и предназначены для анализа данных на огромных файлах. CSVs – это просто капли текста с условными обозначениями.

Один из способов сделать это – объединить dfs. Он может съесть много памяти. Насколько огромны файлы?

 filelist = ['file1.txt', 'file2.txt'] df = pd.concat([pd.read_csv(x, sep="\t") for x in filelist], axis=0)