#python #excel #pandas
Вопрос:
У меня есть файл Excel с 13 вкладками, и я хочу написать функцию, которая берет указанные листы из файла, преобразует их в отдельные фреймы данных, а затем объединяет их в список фреймов данных. В этом случае я хочу взять листы с надписями «tblProviderDetails», «tblSubmissionStatus» и «Данные проверки данных», преобразовать их в фреймы данных и составить список. Причина, по которой я хочу, чтобы dfs был в списке, заключается в том, что я хочу в конечном итоге получить входные dfs и вернуть словарь, который затем будет использоваться для создания файла YAML.
В конечном счете, это то, чего я хочу:
dfs = [ 'tblProviderDetails', 'tblSubmissionStatus', 'Data Validation Ref Data']
Причина, по которой я хочу использовать определяемую пользователем функцию, заключается в том, что мне нужна гибкость для вызова любого листа и любого количества листов в список.
Мне удалось написать функцию, которая преобразует отдельные указанные листы в фреймы данных, но я не уверен, как вызвать любое количество листов в файле Excel или создать список внутри функции. Это все, что я успел сделать:
def read_excel(path, sheet_name, header):
dfs = pd.read_excel(path, sheet_name=sheet_name, header=header)
return dfs
df1 = read_excel(path=BASEDIR, sheet_name='tblProviderDetails', header=2)
df2 = read_excel(path=BASEDIR, sheet_name='tblSubmissionStatus', header=2)
df3 = read_excel(path=BASEDIR, sheet_name='Data Validation Ref Data', header=2)
Спасибо вам за вашу помощь.
Ответ №1:
Существует несколько способов сделать это, но, возможно, самый простой способ-сначала получить все имена листов, а затем в цикле для каждого имени листа загрузить результат во фрейм данных и добавить его в требуемый список.
dfList = []
def read_excel(path, h):
xls = pd.ExcelFile(path)
# Now you can access all sheetnames in the file
sheetsList = xls.sheet_names
# ['sheet1', 'sheet2', ...]
for sheet in sheetsList:
dfList.append(pd.read_excel(path, sheet_name=sheet, header
=h))
read_excel('book.xlsx',2)
print(dfList)
Комментарии:
1. Как вы называете конкретные листы Excel? Стал бы я добавлять эти строки внутри функции выше? Извините, это все еще немного неясно
2. Отредактированный ответ, проверьте еще раз.
3. Приведенный выше код автоматически прочитает все листы excel в файле excel, преобразует их в фреймы данных и добавит их все в список фреймов данных, который, я полагаю, является тем, о чем вы просили.
4. Аргумент ‘sheet_name’ в файле pd.read_excel можно использовать для нескольких листов, передав список конкретных листов, которые вы хотите использовать. В вашем случае это будет sheet_name =[ ‘tblProviderDetails’, ‘tblSubmissionStatus’, ‘Данные проверки данных’].
5. @umar Я не хочу, чтобы он автоматически читал все листы. Я хочу, чтобы функция могла считывать любую комбинацию листов. В этом случае я хочу, чтобы имена листов были: «tblProviderDetails», «tblSubmissionStatus», «Данные проверки данных».
Ответ №2:
Вы можете передать список имен листов иили номер листа параметру sheet_name.
def read_excel(path, sheet_name, header):
sheet_name = ['tblProviderDetails','tblSubmissionStatus','Data Validation
Ref Data']
dfs = pd.read_excel(path, sheet_name=sheet_name, header=header)
return dfs
Комментарии:
1. Могу ли я передать список имен листов вне функции и во время вызова? т. Е.
read_excel(BASEDIR, sheet_name = ['tblProviderDetails','tblSubmissionStatus','Data Validation Ref Data'], header=2)
и оставить имя листа внутри функции в виде пустого спискаsheet_name=[]
2. Я предполагаю, что ur BASEDIR одинаков для всех листов,поэтому нет необходимости иметь df1, df2 и т. Д. наличие списка листов внутри или вне функции должно работать в любом случае. То, что будет возвращено, — это фрейм данных с указанными именами листов.
3. BASEDIR-это путь к файлу excel. Если я добавлю имена листов внутри вызова функции и распечатаю вывод, я получу
OrderedDict()
. Но когда имена листов находятся внутри функции, и я удаляюsheet_name
параметр, вывод выглядит правильным. Причина, по которой мне нужна возможность добавлять имена листов в вызов функции, заключается в дополнительной гибкости/удобстве использования, но я не могу заставить ее работать.4. Вы должны более подробно объяснить в своем ответе, что делает ваш код