Вопрос или проблема
У меня есть 12 файлов Excel. Каждый из них основан на месяце года, и поэтому каждое имя файла заканчивается на ‘Месяц YYYY’. Например, файл для марта 2021 года заканчивается на ‘March 2021.xlsx’. Я хочу прочитать каждый файл Excel, выбрать определенные столбцы, удалить пустые строки, а затем объединить каждый файл в один файл Excel в качестве именованного листа. Однако я хочу найти имя файла, определить месяц и затем переименовать второй столбец, чтобы указать этот месяц.
Как мне добавить код, чтобы месяц каждого файла использовался как ‘новое имя’ для второго столбца каждого df?
Вот пример с использованием двух месяцев:
Файл один: January 2021.xlsx
A | B |
---|---|
1 | x |
3 | x |
Файл три: February 2021.xlsx
A | B |
---|---|
3 | x |
5 | x |
Я хочу переименовать B, чтобы он представлял месяц соответствующего файла Excel, а затем объединить, чтобы получить:
A | Январь | Февраль |
---|---|---|
1 | x | 0 |
3 | x | x |
5 | 0 | x |
Это то, что я сделал до сих пор.
#Сохранить файлы Excel в списке python
excel_files = list(Path(DATA_DIR).glob('*.xlsx'))
#Прочитать каждый файл в dataframe
dfs = []
for excel_file in excel_files:
df = pd.read_excel(excel_file,sheet_name="Sheet1",header=5,usecols="A,F",skipfooter=8)
df.dropna(how='any', axis=0, inplace = True)
month_name = excel_file.stem.split()[0] # Получить название месяца из имени файла
df.rename(columns={'old-name': month_name}, inplace=True) # Переименовать столбец
dfs.append(df)
#Собрать список данных для объединения
data_frames = [dfs[0], dfs[1],dfs[2] ... dfs[11]]
#Объединить все dataframes
df_merged = reduce(lambda left,right: pd.merge(left,right,on=['A'],
how='outer'), data_frames).fillna(0)
Мне нужна помощь в добавлении кода, чтобы месяц каждого файла использовался как ‘новое имя’ для второго столбца каждого df?
Ответ или решение
Для решения задачи чтения нескольких Excel файлов, обработки данных и объединения их в один DataFrame с переименованием столбцов в зависимости от месяца в имени файла, можно использовать библиотеку pandas в Python. Давайте разберёмся, как это можно сделать шаг за шагом.
Шаг 1: Импорт необходимых библиотек
Для начала убедитесь, что у вас установлены необходимые библиотеки. Вам понадобятся pandas
и pathlib
для работы с файлами.
import pandas as pd
from pathlib import Path
from functools import reduce
Шаг 2: Определение каталога с данными
Создайте переменную для хранения пути к каталогу, где находятся ваши Excel файлы. Замените DATA_DIR
на фактический путь.
DATA_DIR = 'ваш/путь/к/каталогу'
Шаг 3: Сбор файлов
Соберите все Excel файлы в список:
excel_files = list(Path(DATA_DIR).glob('*.xlsx'))
Шаг 4: Чтение файлов и обработка данных
Вам нужно будет написать цикл, который будет проходить по каждому файлу, читать его в DataFrame, очищать от пустых строк и переименовывать нужный столбец в соответствии с месяцем, который вы извлечёте из имени файла.
dfs = []
for excel_file in excel_files:
# Чтение файла в DataFrame начиная с определённой строки и выбирая нужные столбцы
df = pd.read_excel(excel_file, sheet_name="Sheet1", header=5, usecols="A,F", skipfooter=8)
# Удаление пустых строк
df.dropna(how='any', axis=0, inplace=True)
# Извлечение месяца из имени файла
month = excel_file.stem.split()[-2] # Извлекает месяц (например, "January")
# Переименование второго столбца в соответствующий месяц
df.rename(columns={df.columns[1]: month}, inplace=True)
# Добавление DataFrame в список
dfs.append(df)
Шаг 5: Объединение DataFrame в один
После того как все DataFrame собраны в список, можно их объединить.
# Объединение всех DataFrame по столбцу 'A'
df_merged = reduce(lambda left, right: pd.merge(left, right, on=['A'], how='outer'), dfs).fillna(0)
Шаг 6: Сохранение объединённого DataFrame в Excel
Вы можете сохранить полученный DataFrame в Excel файл. Например, вы можете сохранить результаты в файл с одним листом.
df_merged.to_excel('merged_data.xlsx', index=False)
Заключение
Теперь у вас есть полный код, который решает поставленную задачу — чтение множества Excel файлов в DataFrames, переименование столбцов в соответствии с месяцем из имени файла и объединение всех DataFrames в один. Этот подход обеспечивает возможность модульного изменения, что упрощает дальнейшую работу с данными.
Если у вас остались вопросы или нужна дополнительная информация, не стесняйтесь их задать!