Помогите исправить код для сводной таблицы
Хочу создать сводную таблицу. Проблема заключается в том, что ['napr'] == 'ЭК') не для всех tnved4, поэтому выводит что-то вроде KeyError: 5407. Необходимо сделать так, чтобы если значения, соответствующие одновременно нужному tnved4 и нужному napr не находятся в изначальной таблице, то выводятся нули. Как мне это сделать?
import pandas as pd
# Загрузка данных из файла Excel в DataFrame
file_path = 'ВПР+доработка1.xlsx'
df = pd.read_excel(file_path)
# Преобразование года и месяца из текста в числа
df['year'] = df['year'].astype(int)
df['month'] = df['month'].astype(int)
# Определенные значения для фильтрации
desired_tnved4 = [5407, 2710, 6102, 6104]
desired_years = [2022, 2023]
desired_months = [1, 2, 3, 4, 5, 6, 7] # Здесь указываем несколько месяцев для фильтрации
# Фильтрация данных для 2022 года
data_2022 = df[(df['tnved4'].isin(desired_tnved4)) &
(df['year'] == 2022) &
(df['month'].isin(desired_months) &
(df['napr'] == 'ЭК'))]
# Фильтрация данных для 2023 года
data_2023 = df[(df['tnved4'].isin(desired_tnved4)) &
(df['year'] == 2023) &
(df['month'].isin(desired_months) &
(df['napr'] == 'ЭК'))]
# Создание сводной таблицы для 2022 года (по стоимости)
pivot_table_2022_stoimost = pd.pivot_table(data_2022,
index=['tnved4', 'Блок'],
columns=['year', 'month'],
values='Stoim',
aggfunc='sum')
# Создание сводной таблицы для 2023 года (по стоимости)
pivot_table_2023_stoimost = pd.pivot_table(data_2023,
index=['tnved4', 'Блок'],
columns=['year', 'month'],
values='Stoim',
aggfunc='sum')
# Создание сводной таблицы для 2022 года (по количеству)
pivot_table_2022_kolichestvo = pd.pivot_table(data_2022,
index=['tnved4', 'Блок'],
columns=['year', 'month'],
values='Kol',
aggfunc='sum')
# Создание сводной таблицы для 2023 года (по количеству)
pivot_table_2023_kolichestvo = pd.pivot_table(data_2023,
index=['tnved4', 'Блок'],
columns=['year', 'month'],
values='Kol',
aggfunc='sum')
# Вычисление суммы для каждого года (для стоимости и количества)
sum_2022_stoimost = pivot_table_2022_stoimost.sum(axis=1)
sum_2022_kolichestvo = pivot_table_2022_kolichestvo.sum(axis=1)
sum_2023_stoimost = pivot_table_2023_stoimost.sum(axis=1)
sum_2023_kolichestvo = pivot_table_2023_kolichestvo.sum(axis=1)
# Вычисление отношения суммы для 2023 года к сумме для 2022 года (для стоимости и количества)
ratio_stoimost = ((sum_2023_stoimost / sum_2022_stoimost) - 1) * 100
ratio_kolichestvo = ((sum_2023_kolichestvo / sum_2022_kolichestvo) - 1) * 100
# Объединение сводных таблиц
merged_table_stoimost = pd.concat([pivot_table_2022_stoimost, pivot_table_2023_stoimost], axis=1)
merged_table_kolichestvo = pd.concat([pivot_table_2022_kolichestvo, pivot_table_2023_kolichestvo], axis=1)
# Вставка колонок "Kol" и "Stoim" сверху сводной таблицы
merged_table_stoimost.insert(0, ('', 'Стоимость, $'), '')
merged_table_kolichestvo.insert(0, ('', 'Количество, шт'), '')
# Добавление столбца "Total" с суммами по месяцам внизу таблицы
merged_table_stoimost.loc[('Total', ''), :] = merged_table_stoimost.sum()
merged_table_kolichestvo.loc[('Total', ''), :] = merged_table_kolichestvo.sum()
# Добавление новых колонок с отношением в сводную таблицу
merged_table_stoimost['Отношение Стоимость 2023/2022 (%)'] = ratio_stoimost
merged_table_kolichestvo['Отношение Количество 2023/2022 (%)'] = ratio_kolichestvo
# Объединение сводных таблиц снова
merged_table = pd.concat([merged_table_stoimost, merged_table_kolichestvo], axis=1)
# Добавление строки с общей суммой по блокам за каждый месяц
merged_table.loc[('Total', ''), :] = merged_table.sum()
# Преобразование всех значений в DataFrame в числовой формат
merged_table = merged_table.apply(pd.to_numeric, errors='coerce')
# Деление значения в ячейке ('Total', '') на 2
merged_table.loc[('Total', ''), :] /= 2
# Добавление строки с суммой по блокам за каждый месяц для tnved4=5407
merged_table.loc[(5407, 'Всего'), :] = merged_table.loc[5407].sum()
# Добавление строки с суммой по блокам за каждый месяц для tnved4=2710
merged_table.loc[(2710, 'Всего'), :] = merged_table.loc[2710].sum()
merged_table.loc[(6102, 'Всего'), :] = merged_table.loc[6102].sum()
merged_table.loc[(6104, 'Всего'), :] = merged_table.loc[6104].sum()
# Вывод объединенной сводной таблицы на экран
merged_table.to_excel('merged_27.xlsx')
Источник: Stack Overflow на русском