Загрузка данных


import pandas as pd
import glob
import os

# --- НАСТРОЙКИ ПУТЕЙ ---
# Папка, где лежат ваши 40+ таблиц из выгрузки (если они в той же папке, оставьте './выгрузка/*.xlsx')
folder_with_tables = './выгрузка/*.xlsx' 
# Ваш основной файл, куда нужно всё собрать (если он есть отдельно)
main_file = 'result.xlsx'
# Итоговый файл
output_file = 'result_final.xlsx'

# 1. Сбор всех таблиц в одну
all_files = glob.glob(folder_with_tables)
df_list = []

# Если основной файл лежит отдельно, добавляем его в список чтения
if os.path.exists(main_file) and main_file not in all_files:
    all_files.append(main_file)

for file in all_files:
    try:
        # Читаем все листы в каждом Excel-файле (на случай, если данные на разных вкладках)
        xls = pd.read_excel(file, sheet_name=None)
        for sheet_name, df_sheet in xls.items():
            # Убираем лишние пробелы в названиях столбцов
            df_sheet.columns = df_sheet.columns.astype(str).str.strip()
            if 'Наименование дисциплины' in df_sheet.columns and 'Группа' in df_sheet.columns:
                df_list.append(df_sheet)
    except Exception as e:
        print(f"Ошибка при чтении файла {file}: {e}")

if not df_list:
    raise ValueError("Не найдено подходящих таблиц с нужными столбцами!")

# Объединяем все найденные таблицы
df = pd.concat(df_list, ignore_index=True)

# 2. Фильтруем предмет "Физическая культура и спорт" (без учета регистра и лишних пробелов)
target_subject = 'физическая культура и спорт'
df_filtered = df[
    df['Наименование дисциплины'].astype(str).str.strip().str.lower() == target_subject
].copy()

# 3. Разбиваем группы, записанные через "|", на отдельные строки
df_filtered['Группа'] = df_filtered['Группа'].astype(str).str.split('|')
df_exploded = df_filtered.explode('Группа')
df_exploded['Группа'] = df_exploded['Группа'].str.strip()

# Определяем точное название первого столбца с институтом/факультетом (на фото он обрезан: "Институт гру...")
inst_col = [col for col in df_exploded.columns if 'институт' in col.lower() or 'факультет' in col.lower()][0]

# 4. Замена факультетов по вашим правилам
# Меняем ИГРИК на ФГРИК
df_exploded[inst_col] = df_exploded[inst_col].astype(str).str.strip().replace({'ИГРИК': 'ФГРИК'})

# Для групп 261-1011 и 264-1011 ставим факультет ПШ ИД
df_exploded.loc[df_exploded['Группа'].isin(['261-1011', '264-1011']), inst_col] = 'ПШ ИД'

# 5. Автозаполнение Формы обучения и Уровня образования по 3-й цифре группы (например, 256-333 -> '6')
def parse_group_code(row):
    group = str(row['Группа'])
    # Проверяем, что строка начинается минимум с 3 цифр до дефиса
    prefix = group.split('-')[0]
    if len(prefix) >= 3 and prefix.isdigit():
        code = prefix[2] # Третья цифра (индекс 2)
        mapping = {
            '1': ('Очная', 'Бакалавриат'),
            '2': ('Очно-заочная', 'Бакалавриат'),
            '3': ('Заочная', 'Бакалавриат'),
            '4': ('Очная', 'Магистратура'),
            '5': ('Очно-заочная', 'Магистратура'),
            '6': ('Заочная', 'Магистратура')
        }
        if code in mapping:
            return pd.Series(mapping[code])
            
    # Если формат группы нестандартный, оставляем старые значения
    return pd.Series([row.get('Форма обучения'), row.get('Уровень образования')])

df_exploded[['Форма обучения', 'Уровень образования']] = df_exploded.apply(parse_group_code, axis=1)

# Удаляем полные дубликаты строк, если они возникли при слиянии 40 таблиц
df_exploded = df_exploded.drop_duplicates()

# 6. Сохраняем результат
df_exploded.to_excel(output_file, index=False)
print(f"Готово! Обработано строк: {len(df_exploded)}. Результат в файле: {output_file}")