индивидуальное комбинирование листов Excel с использованием панд - PullRequest
0 голосов
/ 29 июня 2018

Я пишу функцию в пандах, которая может читать файлы Excel из рабочего каталога. Каждый из файлов Excel состоит из нескольких листов, однако соответствующие листы в каждом файле имеют одинаковые имена столбцов, и количество листов в каждом файле также одинаково.

Я хотел бы иметь функцию, которая может объединять / добавлять каждый лист из разных файлов, так что sheet1 из всех файлов объединяется в информационный кадр, sheet2 из всех файлов объединяется как второй dataframe и так далее. В конце я хотел бы узнать количество созданных фреймов данных.

Для этого я написал следующий код:

fpath = "/path to files/"


from os import walk

df = pd.DataFrame()
f = []
xls = []
dff = []

mypath = fpath

for (dirpath, dirnames, filenames) in walk(mypath):
    f.extend(filenames)
    break

for i in range(0, len(f)):
    f[i] = mypath+"/"+f[i]
    xls.append(pd.ExcelFile(f[i]))


cout = 0
for fil in range(0, len(xls)):
    for sh in range(0, len(xls)):
        if(cout <= len(xls)):
            df = df.append(pd.read_excel(xls[sh], fil))
            dff.append(df)
        cout = cout + 1

Я ввел переменную cout, чтобы контролировать, что после каждого слияния / добавления листа 1 из всех файлов цикл должен прерываться, иначе все листы будут объединены в один кадр данных.

Проблема : Проблема в том, что функция останавливается после возврата только одного кадра данных, в котором объединены первые листы. Если я уберу переключатель «cout», то все листы будут объединены. Может ли кто-нибудь помочь мне исправить код функции так, чтобы он 1) объединял / добавлял соответствующие листы из каждого файла, 2) создавал фрейм данных из (1) и возвращал фреймы данных? Таким образом, у меня будет информационный блок для каждого объединенного / добавленного листа.

Может кто-нибудь помочь, пожалуйста?

Примечание: Я делаю это в пандах, но любезно предлагаю, если вы считаете, что есть лучшие альтернативы в R или любом другом языке программирования.

1 Ответ

0 голосов
/ 29 июня 2018

Хорошо, я просмотрел ваш код, и у меня мог бы быть ответ для вас без такого большого количества циклов. Может быть, это помогает, а может и нет.

Поскольку вы указываете на одну папку, давайте использовать listdir. Используйте pd.ExcelFile один раз, чтобы получить имена листов, а затем переберите все имена листов и pd.concat различные файлы Excel для каждого конкретного имени листа.

import pandas as pd
import os

# Preparation
p = 'exceltest'  #<-- folder name
files = [os.path.join(p,i) for i in os.listdir(p) if i.endswith('.xlsx')]
sheets = pd.ExcelFile(files[0]).sheet_names

# Dictionary holding the sheet_names as keys
dfs = {s: pd.concat(pd.read_excel(f, sheet_name=s) for f in files) for s in sheets}

# Only for demo purpose
print(dfs[sheets[0]])

В моих файлах примеров (с именем Workbook1, Workbook2) с именами sheet_name (Sheet 1, Sheet 2) и (Matrix A, B rowbreak 1,2) это печатается:

   A  B
0  1  2
0  1  2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...