Ошибка «length mismatch: expected axis has 3 elements, new values have 4 elements» возникает, когда вы пытаетесь задать новое имя для столбцов DataFrame, и количество имен, которые вы указываете, не соответствует количеству столбцов в DataFrame.
В вашем случае код вызывает функцию `rename_columns(test_df)`, которая пытается изменить имена столбцов на ['Shop_1', 'Shop_2', 'Shop_3', 'Shop_4']. Однако исходный DataFrame, вероятно, содержит 3 столбца, что и приводит к этой ошибке.
**Причины возникновения ошибки:**
1. **Изменение структуры данных:** Возможно, при чтении файла `Orders.xlsx` в DataFrame в исходных данных содержится меньше 4 столбцов. Проверьте количество столбцов исходного DataFrame перед переименованием.
2. **Неправильное восприятие заголовков:** Если в файле нет заголовков, Pandas по умолчанию может интерпретировать первую строку как данные, а не как заголовки столбцов.
## Исправленный код
Вот исправленный код с обработкой ошибок и проверкой количества столбцов:
```python
import pandas as pd
import os
# Путь к файлу
orders_path = './data/Orders.xlsx'
n = 1
# Функция для переименования столбцов
def rename_columns(test_df):
expected_columns = 4
if len(test_df.columns) != expected_columns:
print(f"Ожидалось {expected_columns} столбца, но найдено {len(test_df.columns)}. Переименование невозможно.")
return None
test_df.columns = ['Shop_1', 'Shop_2', 'Shop_3', 'Shop_4']
return test_df
# Проверка существования файла
if not os.path.exists(orders_path):
print(f"Файл {orders_path} не найден.")
else:
test_df = pd.read_excel(orders_path, index_col=0)
# Функция для замены NaN значений
def fillna_values(test_df, n=0):
res = rename_columns(test_df)
if res is not None: # Убедитесь, что переименование прошло успешно
return res.fillna(n)
else:
return None
# Функция ETL для сбора итоговых отчетов
def etl():
res = fillna_values(test_df, n)
if res is not None: # Убедитесь, что заполнение прошло успешно
res.to_csv('./data/Orders_etl.csv', index=True)
res.to_excel('./data/Orders_etl.xlsx', index=True)
return 'Файлы успешно сохранены'
else:
return 'Ошибка при обработке данных'
result = etl()
print(result)
```
### Изменения:
1. **Проверка количества столбцов:** Перед переименованием столбцов добавлена проверка, чтобы убедиться, что количество столбцов соответствует ожидаемому.
2. **Обработка ошибок:** В функции `fillna_values` добавлена проверка, чтобы убедиться, что переименование столбцов прошло успешно перед попыткой заменить NaN значения.
Эти изменения помогут избежать ошибок и обеспечат корректное выполнение вашего кода.