Как объединить набор файлов в таблицу и избежать проблем
Рассмотрим, как считать данные из набора файлов на жестком диске и не допустить ошибку.
Решать задачу будем средствами библиотеки Pandas. Допустим, что файлы располагаются по адресу people_income/files относительно вашей рабочей директории. Тогда считать данные из папки в список датафреймов (предполагается формат xlsx) можно при помощи следующего скрипта:
import os
import pandas as pd
import time
# collecting data
data_path = 'people_income/files'
data_l=[]
names=[]
all_size = 0
sizes = []
# проверяем время считывания файлов
start_r = time.time()
for (рarent, dirs, files) in os.walk(data_path):
for fn in files:
start = time.time()
data_l.append(pd.read_excel(os.path.join(рarent,fn), dtype ='str'))
names.append(рarent+'/'+fn)
sizes.append(data_l[-1].shape[0])
all_size += data_l[-1].shape[0]
end = time.time()
print(f'время считывания файла "{рarent+"/"+fn}" составило {end-start} сек.')
print(f'форма массива - {data_l[-1].shape}\n')
end_r = time.time()
print(f'время считывания всех файлов составило {end_r-start_r} сек.')Мы задали корневую папку поиска (data_path) для добавления в список (data_l) набора датафреймов, соответствующих каждому файлу. Также наблюдаем за временем считывания и размерами массивов для того, чтобы удостовериться в правильности своих действий.
Теперь можно осуществить конкатенацию:
# проверяем время конкатенации файлов
start = time.time()
df = data_l[0]
for it in data_l[1:]:
df = pd.concat([it,df], ignore_index=True)
end = time.time()
print(f'время конкатенации файлов составило {end-start} сек.')В связи с возможными ошибками при автоматическом распознавании типов (рассказывал ранее) при считывании таблиц использовался параметр dtype='str'. Соответственно, после может потребоваться явно преобразовать типы некоторых столбцов:
# например df['зарплата'] = df['зарплата'].astype(np.float64)
В ходе объединения таблиц нас могут ожидать трудности, связанные с несовпадением полей в файлах:
# проверяем совпадение полей в файлах
set_cols = set(data_l[0].columns)
for it in data_l[1:]:
set_cols_t = set(it.columns)
set_cols = set_cols.union(set_cols_t)
# образцовый набор стб в data_l[0]
assert len(set_cols)==len(set(data_l[0].columns)),'количество стб не совпадает'
Сложности могут быть связаны не только с разным обозначением столбцов, но и наличием нескольких листов в файле. Например, требуемая информация может располагаться не на первом листе, который считывается по умолчанию функцией read_excel. Тогда может потребоваться указать параметр sheet_name.
Таким образом, будьте внимательны при считывании файлов и следите за соответствием:
- количества записей в каждой и итоговой таблице
- наименованиями полей в исходных и итоговой таблице
Отслеживание ошибок данного типа поможет сэкономить вам нервы и время. А с какими подводными камнями при считывании файлов сталкивались вы, делитесь в комментариях?