Перенос значений ячеек из разных столбцов и листов из нескольких файлов Excel с одинаковой структурой в один кадр данных - PullRequest
0 голосов
/ 28 июня 2018

У меня есть отчет в Excel, который содержит набор точек данных, которые я хочу скомпилировать из нескольких файлов одного формата в основной набор данных. Первоначальный шаг, который я предпринял, состоял в том, чтобы извлечь нужные мне точки данных из нескольких листов в один кадр данных pandas. Смотрите шаги ниже

Я изначально импортировал файл Excel и проанализировал его

import pandas as pd
xl = pd.ExcelFile(r"C:\Users\Nicola\Desktop\ISP 2016-20 Ops-Technical Form.xlsm")
df = xl.parse("FSL, WASH, DRM") #name of sheet #1

Затем я нашел точки данных, необходимые для синтеза

a=df.iloc[5:20,3:5]
a1=df.iloc[6:9,10:12]
b=df.iloc[31:35,3:5]
b1=df.iloc[31:35,10:12]

Затем я объединил и выровнял позиционирование столбцов, чтобы сохранить весь список значений в одном и том же столбце:

dfcon=pd.concat(([a,b]))
dfcon2=pd.concat(([a1,b1]))
new_cols = {x: y for x, y in zip(dfcon.columns, dfcon2.columns)}
dfcont2=dfcon2.append(dfcon.rename(columns=new_cols))

И, наконец, создал фрейм данных со строкой значений, которые мне нужны

master=pd.DataFrame(dfcont2)
finalmaster=master.transpose()

Следующие два шага, которые я хочу выполнить: 1) повторить тот же код для 50 файлов Excel 2) Скомпилируйте всю строку значений из этого набора файлов Excel в один единственный кадр данных Pandas без повторного запуска этого кода и скомпилируйте вручную, экспортировав его в Excel.

Любая поддержка будет принята с благодарностью. Спасибо

Ответы [ 2 ]

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

Нашел решение, которое работает для меня, спасибо за вклад, jezrael. Для дальнейшего объяснения:

1) Импортировал файлы с одинаковой структурой из папки «Мой рабочий стол», проанализировал и выбрал лист Excel, из которого можно извлечь данные из разных мест (iloc)

import glob
dfs = []
for f in glob.glob('C:/Users/Nicola/Desktop/OPS Form/*.xlsm'):
    df = pd.ExcelFile(io=f, sheet_name=1) 
    df = df.parse("FSL, WASH, DRM")
    a=df.iloc[5:20,3:5]
    a1=df.iloc[7:9,10:12]
    b=df.iloc[31:35,3:5]
    b1=df.iloc[31:35,10:12]
    c=df.iloc[50:56,3:5]
    c1=df.iloc[38:39,10:12]
    d=df.iloc[57:61,3:5]
    e=df.iloc[63:71,3:5]

2) Объединенные и переставленные столбцы для составления первой версии кадра данных (выходной)

    dfcon=pd.concat(([a,b,c,d,e]))
    dfcon2=pd.concat(([a1,b1,c1]))        
    new_cols = {x: y for x, y in zip(dfcon.columns, dfcon2.columns)}
    dfcont2=dfcon2.append(dfcon.rename(columns=new_cols))
    dfs.append(dfcont2.T)

3) Выходные данные представляли одну и ту же строку значений, но повторялись дважды [одну и ту же метку и специфичную для формы запись] из рекурсивных извлечений данных, связанных с местоположениями ILOC.

output = pd.concat(dfs, ignore_index=True) 

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

a=output[2:3]
b=output[1::2]
pd.concat([a,b], axis=0, ignore_index=True)
0 голосов
/ 28 июня 2018

Мне кажется, нужен цикл по именам файлов, созданным glob и последним concat вместе (все файлы имеют одинаковую структуру):

import glob

dfs = []
for f in glob.glob('*.xlsm'):
    df = pd.read_excel(io=f, sheet_name=1)    

    a=df.iloc[5:20,3:5]
    a1=df.iloc[6:9,10:12]
    b=df.iloc[31:35,3:5]
    b1=df.iloc[31:35,10:12]

    dfcon=pd.concat(([a,b]))
    dfcon2=pd.concat(([a1,b1]))
    new_cols = {x: y for x, y in zip(dfcon.columns, dfcon2.columns)}

    dfcont2=dfcon2.append(dfcon.rename(columns=new_cols))
    dfs.append(dfcont2.T)

out = pd.concat(dfs, ignore_index=True)
...