Python. Не обрабатываются дубликаты
Написал функцию, которая обрабатывает ежедневные выгрузки и дозаписывает нужные строки в общий файл. Но на этапе обработки дублей, ничего не происходит (функция внутри функции drop_dupl). В отдельности drop_dupl работает - если прогнать общий файл через нее дубли пропадают.
def neh_today_append():
'''
Функция не будет корректно работать для текущего месяца, если
в словаре month_dict не будет правильно указана пара: имя-ключ месяца
'''
# Функция для обработки дублей - оставляет самую раннюю запись для каждого ЕМИАС, для каждого месяца
def drop_dupl(df):
dfri = df.reset_index(drop=True)
ind = list(dfri.copy().sort_values(by=['emiasid', 'number', 'date'], ascending=[True, True, True])[['emiasid', 'number']]
.drop_duplicates().index)
df_filtred = dfri[dfri.index.isin(ind)]
return df_filtred
# Путь, текущая дата и словарь имя месяца - номер
month_dict = {
#'november' : ['43962', 11],
'december' : ['46472', 12]
#'january' : ['48472', 1]
}
path = 'Z:\\pdn\\data\\emias_data\\xlsx\\'
today = '2023-01-26'#str(pd.Timestamp.today()).split()[0] #'2023-01-26'
# Список файлов, которые не смогут обработаться
list_nosave_files = []
for k, v in month_dict.items():
try:
# Шаблон поиска файла
file_name = glob.glob(path + f'*{v[0]}000*{today}.xlsx')[0]
try:
print(r'ФАЙЛ:', file_name)
day_df = pd.read_excel(file_name, dtype={'emiasid': str})
# Фильтруем нужных пациентов и отбрасываем ненужные колонки
print('--Фильтрация прошла успешно')
filt_df = day_df[day_df.contr_priem_group == 'Приём состоялся']
columns_filter = ['emiasid', 'zapis_group', 'sdel_group', 'variant']
filt_df = filt_df[columns_filter]
# Находим значения для колонок month, number и добавляем соответствующие столбцы
print('--Добавлены колонки с датой и именем выгрузки')
filt_df = filt_df.assign(date = today, month = v[1], number = v[0])
# Приводим дату к формату datetime
filt_df['date'] = pd.to_datetime(filt_df['date'], format='%Y-%m-%d')
#------------------------------------------------------------------------------------------------
# Путь к папке с обработанными данными + считываем данные
print('--Данные из папки neh успешно считаны')
neh_path = r'Z:\pdn\data\neh'
all_df = pd.read_excel(neh_path + '\\neh_all.xlsx', dtype={'emiasid': str})
print(f' Количество строк в neh_all.xlsx {all_df.shape[0]}')
# Обрабатываем случай, когда файла на текущий месяц еще нет
try:
month_path = glob.glob(neh_path + f"\\*{k}*.xlsx")[0]
month_df = pd.read_excel(month_path, dtype={'emiasid': str})
print(f' Количество строк в {k}.xlsx {month_df.shape[0]}')
except:
month_df = pd.DataFrame()
print(f' Новый файл {k}')
# Добавляем новые данные
print('--Данные успешно обновлены')
concat_all_df = pd.concat([all_df, filt_df], axis=0)
print(f' Количество строк в neh_all.xlsx после обновления {concat_all_df.shape[0]}')
concat_month_df = pd.concat([month_df, filt_df], axis=0)
print(f' Количество строк в {k}.xlsx после обновления {concat_month_df.shape[0]}')
# Фильтруем дубликаты
print('--Дубликаты успешно обработанны')
all_df_nodup = drop_dupl(concat_all_df)
print(f' Количество строк в neh_all.xlsx после обработки дубликатов {all_df_nodup.shape[0]}')
month_df_nodup = drop_dupl(concat_month_df)
print(f' Количество строк в {k}.xlsx после обработки дубликатов {month_df_nodup.shape[0]}')
# Сохраняем файлы
print(f'ФАЙЛ ДЛЯ МЕСЯЦА {k} УСПЕШНО СОХРАНЕН')
month_df_nodup.to_excel(neh_path + f'\\neh_{k}_{today.replace("-", "")}.xlsx', index=False)
all_df_nodup.to_excel(neh_path + '\\neh_all.xlsx', index=False)
print('---------------------------------------------------------------------')
except:
list_nosave_files.append(file_name)
print(f'!!!ОШИБКА!!!')
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
continue
except:
print(f'!!!Для месяца {k} файл на текущую дату {today} не найден!!!')
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
continue
# Выводим список не считанных файлов
if len(list_nosave_files) != 0:
print(f'СПИСОК ФАЙЛОВ, КОТОРЫЕ НЕ СЧИТАЛИСЬ:')
for fname in list_nosave_files:
print(fname)
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
print('!!ЗАВЕРШЕНО!!')
