Загрузка нескольких файлов Excel в Pandas (много файлов ... быстро) - PullRequest
0 голосов
/ 12 июня 2018

У меня около 5400 файлов Excel в нескольких (под) папках, и я хочу загрузить их в один фрейм данных.Файлы имеют только 1 лист и могут содержать до 2000+ строк.Ожидается, что общее количество строк составит 2 миллиона или более.

Мой компьютер имеет SSD HD и 8 ГБ памяти и работает довольно быстро.Тем не менее, это займет несколько часов.Что-то не так со мной, код?Буду признателен за любые советы.

%%time
files = glob.glob('asyncDatas/**/*.xlsx',recursive=True)

df = pd.DataFrame()

for num, fname in enumerate(files, start=1):
    print("File #{} | {}".format(num, fname))
    if len(fname) > 0:
        data = pd.read_excel(fname, 'Sheet0', index_col='Time', skiprows=3)
        df = df.append(data)

df.head()

Я догадываюсь, что метод .append занимает слишком много времени, так как он, вероятно, динамически перераспределяет память?Может быть .concat () может быть лучше?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Загрузка данных Excel в Pandas заведомо медленная.Ваш первый вариант - использовать pd.concat один раз в списке фреймов данных , как описано в jezrael .

В противном случае у вас есть несколько вариантов:

  1. Конвертируйте ваши файлы Excel в CSV эффективно за пределами Python.Например, см. этот ответ .Панды лучше читают файлы CSV.Вы можете увидеть дополнительное улучшение, если конвертируетесь в csv.gz (gzipped).
  2. Рассмотрите категориальные данные для улучшения управления памятью;комков;или ленивые операции через библиотеку.См. этот ответ для получения более подробной информации.

Если ваш рабочий процесс включает в себя «много раз читать», я настоятельно рекомендую вам преобразовать из Excel в формат, более удобный для панд, например, CSV,HDF5, или рассол.

0 голосов
/ 12 июня 2018

Сначала добавить к списку DataFrame с и последним только один раз concat, но все еще не уверен, достаточно ли 8GB RAM (но я надеюсь на это):

dfs = []

for num, fname in enumerate(files, start=1):
    print("File #{} | {}".format(num, fname))
    if len(fname) > 0:
        data = pd.read_excel(fname, 'Sheet0', index_col='Time', skiprows=3)
        dfs.append(data)

df = pd.concat(dfs, ignore_index=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...