Как читать отдельные листы Excel в отдельные фреймы данных?

#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. Вы должны более подробно объяснить в своем ответе, что делает ваш код