Попытка создать программу, которая берет несколько таблиц из нескольких рабочих книг и объединяет их с аналогами в других рабочих книгах. - PullRequest
0 голосов
/ 30 октября 2019
import pandas as pd
 from os import listdir

 from os.path import isfile , join

folder = "c:/sheets"

excel_names = [f for f in listdir(folder) if isfile(join(folder, f))]
 print(excel_names)
 excel_files = []
for item in excel_names:
 item = folder + item excel_files.append(item)
 # read them in
excels = [pd.ExcelFile(name) for name in excel_files]
# turn them into dataframes
 frames = [x.parse(x.sheet_names[0], header=None, index_col=None) 
for x in excels]
# delete the first row for all frames except the first
#  i.e. remove the header row -- assumes it's the first

 frames[1:] = [df[1:] for df in frames[1:]]
# concatenate them..
 combined = pd.concat(frames) combined.to_excel(folder+"/combined.xlsx", header=False, index=False)

Это код, который я написал до сих пор, но, кажется, он работает для одного листа только в нескольких книгах. Что мне делать?

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Я думаю, что это может помочь.

У меня есть 3 файла Excel в каталоге, в которых есть данные, которые выглядят так:

enter image description here

Некоторые таблицы имеют несколько листов. Все они имеют одинаковую форму данных, то есть одинаковые столбцы и типы данных.

Импорт пакетов, я использую glob, просто личное предпочтение для получения списков файлов

import pandas as pd
import glob

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

ls_df = []

for file in glob.glob('/location/to/file/*'):
    print(file)
    for sheet in pd.ExcelFile(file).sheet_names:
        ls_df.append(pd.read_excel(file,sheet))

Затем с помощью списка составьте список данных всех электронных таблиц и их листов.

df = pd.concat(ls_df)

В итоге вы получите кадр данных, который выглядит следующим образом

enter image description here

Экспорт в Excel

df.to_excel('test_4.xlsx', index = 0 )

enter image description here

0 голосов
/ 31 октября 2019

IIUC,

Это будет работать только в том случае, если ваш фрейм данных имеет одинаковую форму (по столбцам) для каждого Sheet, в противном случае вам потребуется изменить и адаптировать код в соответствии с вашим вариантом использования.

Шаг 1: список файлов xlsx.

from pathlib import Path
excels = [f for f in Path('c:/sheets').glob('*.xlsx')]

Шаг 2: Создание списка объектов ExcelFile.

xls = [pd.ExcelFile(f) for f in excels]

Шаг 3: Создание словаря ключей,Пары значений, разбитые по рабочим листам.

d = {}

for file in xls:
    for sheet in file.sheet_names:
        if sheet not in d:
            d[sheet] = [] # creates the key which is unique
        else:
            pass # ensures we don't overwrite 
        df = pd.read_excel(file,sheet_name=sheet)
        d[f'{sheet}'].append(df)

Наконец, объедините листы в dataframe_dictionary:

df_dict = {}
for k,v in d.items():
    df_dict[f'{k}'] = pd.concat(v)

print(df_dict['Sheet1'])
      DatA   Vals
0     A  16577
1     B  37287
2     C  32761
0     A  38707
1     B  17301
..  ...    ...
1     B   6292
2     C  49310
0     A   4401
1     B  12170
2     C   8978

[150 rows x 2 columns]

Протестировано на 50 файлах xlsx с двумя листами, каждый из которых имеет одинаковое количество столбцовстроки, но разные данные.

Не вижу, что это не работает в вашем примере.

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