Consolidar Dados no Excel com Python: 3 Métodos Eficazes

Tempo de leitura:

5–8 minutes

Consolidar dados de várias tabelas é uma das operações mais comuns que realizamos no Microsoft Excel. Para o fazer temos sempre várias opções desde logo a utilização de funções como PROCV [VLOOKUP] e PROCX [XLOOKUP]. Se as origens de dados são de origens externas podemos também sempre usar o Power Query como ferramenta base para juntar os dados das várias tabelas.

Mas, se os vários intervalos já se encontram na folha de cálculo e se pretendemos trabalhar o intervalo no seu todo e não apenas 1 ou 2 colunas, podemos usar funções de Python para trabalhar os dados.

É o que vamos ver no artigo com 3 métodos diferentes para juntar vários intervalos num único.

Vamos utilizar a biblioteca Pandas que é ideal para cenários onde temos um intervalo (DataFrame) para trabalhar.

Método 1 | pd.DataFrame.concat

O método pandas.concat() serve para combinar dois ou mais objetos de Pandas, mais especificamente DataFrames ou Series (uma série é uma coluna) ao longo de um eixo específico, ou seja, empilhá-los verticalmente ou juntá-los lado a lado.

Podes pensar nele como uma forma realizar um copy – paste de intervalos, um em cima do outro (empilhados) ou lado a lado.

No cenário temos 3 intervalos que vamos começar por juntá-los na vertical.

Spreadsheet showing product ID data for three regions: Norte, Centro, and Sul, with sales figures for January, February, and March.

Passo 1 – Criar a variável para os intervalos

Podemos considerar cada intervalo como uma base de dados, e no caso vamos guardar cada um dos intervalos como DataFrame aplicando o nome a cada uma das bases.

Screenshot of an Excel spreadsheet showing formulas and data for product sales in three regions: Norte, Centro, and Sul, with a Python function to import data from specific cell ranges.

Após iniciar o código Python numa célula, que podes começar por escrever =PY ou iniciar no botão Inserir Python do separador Fórmulas.

df_1 = xl(“B5:E14”, headers=True)

df_2 = xl(“B17:E28”, headers=True)

df_3 = xl(“B31:E41”, headers=True)

Depois de definido o código, que basicamente armazena cada um dos intervalos numa variável, submetes o código com CTRL + ENTER.

O resultado é uma DataFrame de Python, que na verdade é a df_3 que representa o último intervalo, mas o objetivo é ter uma célula com as 3 bases para podermos chamá-las quando necessário.

Passo 2 – Concatenar todos os intervalos

Para juntar todos os intervalos com o método pd.concat() basta indicarmos sobre a forma de uma lista -> [], todos os intervalos: [df_1, df_2, df_3]. A este resultado dei o nome “consolidado” caso pretenda utilizar esta DataFrame no futuro.

consolidado = pd.concat([df_1, df_2, df_3])

Screenshot of an Excel spreadsheet displaying data consolidation using Python's Pandas library. The formula 'pd.concat' is highlighted, with data for different products and months visible in the table.

Se pretendermos podemos ver o resultado como Array Dinâmico no Excel.

Screenshot of an Excel interface displaying data tables with a Python code snippet for concatenating DataFrames using pandas. The highlighted cell shows the formula 'consolidado = pd.concat([df_1, df_2, df_3])'.

No exemplo podemos reparar que é criado um índice para cada uma das DataFrames. Se pretenderes ignorar este índice pode usar o parâmetro ignore_index = True.

Spreadsheet showing a consolidated view of product sales data by region (NORTE, CENTRO, SUL) with columns for product ID and monthly sales figures (Jan, Feb, Mar).

Aplicar o parâmetro ignore_index = True

consolidado = pd.concat([df_1, df_2, df_3], ignore_index = True)

Screenshot of an Excel spreadsheet displaying data concatenation using pandas in Python, including product IDs and monthly sales figures.

Nota: Podes usar uma solução semelhante com as funções de Excel, neste caso com a função JUNTARV [VSTACK].

Reconhecer os intervalos de origem com pd.concat()

Imagina que ao consolidar os dados pretendes identificar numa coluna o nome do intervalo de origem, para saber de onde vem o conjunto de dados.

Podes implementar esta lógica com outro parâmetro útil da função pd.concat com o parâmetro keys onde mais uma vez, indicas sobre a forma de uma lista o intervalo de valores para as origens.

No exemplo vamos utilizar 3 células do Excel com os nomes dos intervalos.

consolidado = pd.concat(

    [df_1, df_2, df_3],

    keys=[xl(“B4”),xl(“B16”),xl(“B30”)]

)

An Excel spreadsheet displaying three regional data tables labeled 'NORTE', 'CENTRO', and 'SUL', showing product IDs and corresponding sales figures for January, February, and March.

O resultado é a DataFrame com o índice substituído pelo nome de cada Origem.

Excel spreadsheet displaying data with product IDs and monthly sales figures for different regions: NORTE, CENTRO, and SUL, featuring a Python code snippet for data concatenation using pandas.

Concatenar na Horizontal

Embora seja possível concatenar os intervalos na horizontal, como demonstrado no código e na imagem em baixo. Vamos ver uma alternativa melhor com a função pd.DataFrame.merge.

Para juntar na horizontal com a função concat() devemos indicar o índice de cada uma das origens com o parâmetro set_index -> (neste exemplo vamos usar a coluna do ID) e indicar que vamos concatenar os intervalos pelo eixo horizontal -> axis = 1.

Para completar a função adicionei o método .fillna para preencher as células sem dados com um valor em branco.

juntar_h = pd.concat(

    [df_1.set_index(“ID Produto”),df_2.set_index(“ID Produto”),df_3.set_index(“ID Produto”)],

    axis=1).fillna(“”)

DataFrame concatenation using Pandas in Python, showing product IDs and monthly data for two regions: Norte and Centro.

O resultado é uma DataFrame com os intervalos empilhados na horizontal! Como existem IDs que não coincidem em todas as bases obtemos valores em branco, neste caso com o método fillna().

Spreadsheet displaying product data across different regions with monthly values. Highlighted note indicates that only 2 products have data for all 3 intervals.

Utilizar a função pd.DataFrame.merge()

A função merge é mais usada e semelhante para juntar intervalos na horizontal. Assemelha-se mais com o conceito JOIN em SQL ou mesmo o Merge Queries em Power Query.

No próximo exemplo temos 2 tabelas (Departamento e Colaborador), e como habitual, vamos começar por definir as variáveis para cada uma das DataFrames, para podermos reutilizar nas próximas funções.

An Excel spreadsheet displaying two tables. The first table lists departments with IDs, entry dates, and salary information, while the second table contains employee names with their corresponding IDs and office locations.

Juntar a Tabela Colaborador à Tabela Departamento

Para realizarmos a operação Merge, devemos sempre considerar a ordem das Tabelas, sendo que existe sempre uma tabela “à esquerda” e outra “à direita”. Esta questão é importante para sabermos qual é a tabela principal à qual serão adicionadas as restantes.

Por outro lado, esta questão é também fundamental para definir o método de junção, que é possível definir, também como em SQL ou Power Query. Refiro-me aos métodos left, right, inner e outer por exemplo, que definem como as linhas de ambas as tabelas se cruzam. Esta opção é definida com o parâmetro how

Para realizarmos a função merge devemos ainda indicar qual a coluna comum a ambas as tabelas. Esta opção é definida pelo parâmetro on

De resto basta indicar cada uma das tabelas.

juntar = pd.merge(departamento, colaborador, on=[“ID”], how=”left”)

O resultado é uma DataFrame com a junção onde mostra todos os registos da tabela da esquerda (Departamento), com os registos da tabela da direita (Colaborador) mostrando os registos que não têm correspondência do lado direito.

NOTA: se não aplicarmos o parâmetro how, por defeito a função merge aplica o método “inner” resultando apenas nas linhas existentes em simultâneo em ambas as tabelas.

A spreadsheet displaying a pandas DataFrame merge operation in Python, with columns for ID, Department, Entry Date, and Expiration. The top section shows original data, while the bottom section illustrates the merge results, indicating some missing values.

Podemos optar por novamente juntar o método .fillna() para substituir os valores nulos por outro valor qualquer.

juntar = pd.merge(departamento, colaborador, on=[“ID”], how=”left”).fillna(“-“)

Excel spreadsheet displaying a data merging operation using Pandas 'pd.merge' for combining departmental and employee information including IDs, department names, entry dates, expiration dates, employee names, and office locations.

Outros tipos de união | Right

Screenshot of a spreadsheet showing Python code using pandas to merge two DataFrames, along with data tables for departments and employees.

Outros tipos de união | Inner

Spreadsheet showing a merge operation in Python's pandas library, illustrating data frames with department, entry date, and due dates, along with merged employee names and offices.

Outros tipos de união | Outer

Verificar o tipo de junção

Existe um parâmetro adicional indicator que permite verificar numa nova coluna da DataFrame o tipo de junção aplicado.

Com esta opção não podemos anexar o método fillna()

Screenshot of a Python code snippet using Pandas for merging two DataFrames. The left table shows department data with IDs, department names, entry dates, and expiry dates, while the right table includes employee information. The merged results include indicators for how each record was merged.

Aplicar o merge diretamente na DataFrame

O Objeto DataFrame, tem o método merge, que permite realizar a mesma operação. No exemplo estou a definir uma nova DataFrame, aplicando o “método” .merge à DataFrame -> Departamento. Por defeito é aplicado o join com a opção “inner”.

novos_dados = departamento.merge(colaborador, on=[“ID”])

Excel spreadsheet displaying a merged DataFrame using Pandas with columns for ID, Department, Entry Date, Expiration, Name, and Office. The interface shows merged data from two tables, highlighting the merging process.

Utilizar o método pd.DataFrame.join()

O último é exemplo é o método join() disponível na DataFrame. A principal diferença em relação à função merge é, por um lado, o resultado do exemplo anterior, onde verificámos que a função merge é autónoma, mas que tem o outro lado da moeda com o método .merge. O método join() é focado quase exclusivamente em combinar dados através dos índices das DataFrames.

Uma vez que este método é focado nos índices, devemos em primeiro lugar considerar um novo índice para as DataFrames. Esta opção é importante porque quando é selecionado o intervalo, o Python cria um índice automático. Neste caso especifico pretendo usar a coluna ID de cada uma das tabelas / intervalos como índice.

Assim vamos usar o parâmetro set_index quando definirmos as DataFrames.

departamento = xl(“B5:E12”, headers=True).set_index(“ID”)

colaborador = xl(“B15:D22”, headers=True).set_index(“ID”)

An Excel sheet showing data related to departments and collaborators, including ID, department names, entry dates, and other identifiers, with a highlighted Pandas DataFrame join operation in the formula bar.

Agora para aplicar o método .join() o processo é muito semelhante ao método .merge().

Por defeito a junção é feita pela opção “inner” mas podemos indicar o parâmetro how.

O método é aplicado diretamente na DataFrame!

juntar_join = colaborador.join(departamento, how=”left”).fillna(“-“)

Screenshot of a spreadsheet using Pandas to join two DataFrames, showcasing employee data with columns such as ID, Department, Entry Date, and Due Date.

Aqui vai um resumo das 3 alternativas que vimos no artigo:

Método

pd.DataFrame.concat(): Empilhar os intervalos com as mesmas colunas ou apenas “colar” lateralmente os dados.

pd.DataFrame.merge(): Para realizar operações de junção mais complexas (semelhante a SQL ou Power Query), com a possibilidade de indicar a coluna de junção entre as tabelas.pd.DataFrame.join(): Unir tabelas de forma rápida quando os dados já estão definidos pelos índices respetivos índices.

Próximo artigo:

Artigo Anterior:


Comments

Leave a Reply

Discover more from Exceldriven

Subscribe now to keep reading and get access to the full archive.

Continue reading