pd.concat para empilhar DataFrames
Empilhe DataFrames vertical ou horizontalmente com pd.concat, alinhe-os pelo índice ou pelas colunas e trate índices duplicados.
pd.concat para empilhar DataFrames é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Pandas & NumPy Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
Por que concatenar DataFrames?
Em projetos reais, os dados raramente chegam em um único arquivo. O senhor pode ter arquivos de vendas mensais, exportações de pesquisas regionais ou resultados de consultas a um banco de dados divididos entre várias consultas. A concatenação empilha esses DataFrames separados em uma única tabela combinada. O Pandas fornece pd.concat() para essa finalidade, lidando tanto com o empilhamento vertical, por linhas, quanto com o horizontal, por colunas.
Concatenação vertical básica
O uso mais comum de pd.concat() é empilhar DataFrames verticalmente, adicionando mais linhas. Passe uma lista de DataFrames, e a função os acrescentará um abaixo do outro. Ambos os DataFrames devem ter colunas compatíveis para produzir um resultado limpo. O Pandas alinha automaticamente os nomes das colunas, preenchendo as colunas ausentes com NaN.
import pandas as pd
jan = pd.DataFrame({'product': ['A', 'B'], 'sales': [100, 200]})
feb = pd.DataFrame({'product': ['A', 'C'], 'sales': [150, 120]})
combined = pd.concat([jan, feb])
print(combined)
# product sales
# 0 A 100
# 1 B 200
# 0 A 150
# 1 C 120Redefinindo o índice após concat
Observe que pd.concat() preserva os índices originais de cada DataFrame, o que pode resultar em valores de índice duplicados, como no exemplo acima, com duas linhas no índice 0 e duas no índice 1. Passe ignore_index=True para criar um novo índice inteiro sequencial no resultado combinado, que é quase sempre o que o senhor deseja.
combined = pd.concat([jan, feb], ignore_index=True)
print(combined)
# product sales
# 0 A 100
# 1 B 200
# 2 A 150
# 3 C 120
print(combined.index)
# RangeIndex(start=0, stop=4, step=1)Rastreando a origem com keys
Ao concatenar dados de várias fontes, talvez o senhor queira saber de qual DataFrame original veio cada linha. Passe o parâmetro keys com uma lista de rótulos. O Pandas cria um MultiIndex cujo nível externo identifica a fonte. Em seguida, o senhor pode usar .loc['label'] para acessar as linhas de uma fonte específica.
combined = pd.concat([jan, feb], keys=['January', 'February'])
print(combined)
# product sales
# January 0 A 100
# 1 B 200
# February 0 A 150
# 1 C 120
# Access only February rows
print(combined.loc['February'])Concatenação horizontal com axis=1
Passe axis=1 para concatenar DataFrames lado a lado, adicionando mais colunas. O Pandas os alinha pelo índice das linhas, portanto ambos os DataFrames devem ter o mesmo índice para produzir um resultado limpo. Se os índices forem diferentes, as linhas sem correspondência serão preenchidas com NaN. Isso é útil para combinar atributos calculados a partir do mesmo conjunto de dados em etapas separadas.
names = pd.DataFrame({'name': ['Alice', 'Bob', 'Carol']}, index=[1, 2, 3])
scores = pd.DataFrame({'score': [95, 88, 72]}, index=[1, 2, 3])
combined = pd.concat([names, scores], axis=1)
print(combined)
# name score
# 1 Alice 95
# 2 Bob 88
# 3 Carol 72Lidando com colunas incompatíveis
Se os DataFrames que estão sendo concatenados tiverem colunas diferentes, o Pandas manterá todas as colunas e preencherá os valores ausentes com NaN. Esse é o comportamento padrão de join='outer'. Se o senhor quiser manter apenas as colunas presentes em todos os DataFrames, passe join='inner', que descarta qualquer coluna ausente em uma das fontes.
df1 = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
df2 = pd.DataFrame({'b': [5, 6], 'c': [7, 8]})
# Outer join (default): keeps all columns
print(pd.concat([df1, df2], ignore_index=True))
# a b c
# 0 1.0 3 NaN
# 1 2.0 4 NaN
# 2 NaN 5 7.0
# 3 NaN 6 8.0
# Inner join: keeps only shared columns
print(pd.concat([df1, df2], join='inner', ignore_index=True))
# b
# 0 3
# 1 4
# 2 5
# 3 6Concatenando vários arquivos em um laço
Um padrão típico ao carregar vários arquivos é reunir todos os DataFrames em uma lista e chamar pd.concat() uma única vez no final. Evite concatenar dentro de um laço, por exemplo, df = pd.concat([df, new_chunk]), porque isso cria uma nova cópia do DataFrame a cada iteração, levando a uma complexidade de tempo quadrática em coleções grandes.
import glob
# Efficient: collect first, concat once
files = glob.glob('data/sales_*.csv')
frames = [pd.read_csv(f) for f in files]
combined = pd.concat(frames, ignore_index=True)
# Inefficient (avoid):
# result = pd.DataFrame()
# for f in files:
# result = pd.concat([result, pd.read_csv(f)]) # slow!Concatenando Series
pd.concat() funciona tanto com Series quanto com DataFrames. Concatenar verticalmente uma lista de Series produz uma Series mais longa. Concatenar com axis=1 produz um DataFrame em que cada Series se torna uma coluna. As Series são alinhadas pelo índice, portanto os rótulos do índice devem coincidir para uma concatenação horizontal limpa.
s1 = pd.Series([1, 2, 3], name='x')
s2 = pd.Series([4, 5, 6], name='y')
# Vertical: one long Series
print(pd.concat([s1, s2]))
# 0 1
# 1 2
# ...
# Horizontal: a DataFrame with two columns
print(pd.concat([s1, s2], axis=1))
# x y
# 0 1 4
# 1 2 5
# 2 3 6Verificando o resultado concatenado
Depois de concatenar, verifique sempre se o resultado tem o formato esperado e se não contém valores NaN inesperados. Um padrão rápido de verificação de consistência é comparar a quantidade de linhas combinada com a soma das quantidades individuais e chamar isna().sum() para identificar valores ausentes introduzidos involuntariamente pelo desalinhamento das colunas. Essas verificações evitam que problemas silenciosos de qualidade dos dados se propaguem para a sua análise.
combined = pd.concat([jan, feb], ignore_index=True)
# Sanity checks
assert len(combined) == len(jan) + len(feb), 'Row count mismatch'
print('Missing values per column:')
print(combined.isna().sum())
print('Shape:', combined.shape)concat vs append (obsoleto)
Códigos antigos do Pandas podem usar df.append(other), que era um invólucro conveniente para pd.concat(). Esse método foi descontinuado no Pandas 1.4 e removido no Pandas 2.0. Em códigos modernos, use sempre pd.concat([df, other], ignore_index=True). O comportamento é idêntico, mas pd.concat é mais explícito e permite concatenar mais de dois DataFrames de uma só vez.
# Old (removed in Pandas 2.0):
# combined = jan.append(feb, ignore_index=True)
# Modern equivalent:
combined = pd.concat([jan, feb], ignore_index=True)
print(combined)Exemplo prático: relatório anual de vendas
Veja um padrão realista: carregar DataFrames mensais, adicionar um rótulo de origem, concatená-los e calcular um resumo do ano inteiro. O parâmetro keys facilita rastrear cada linha até seu mês, e ignore_index=True, combinado com uma coluna de mês, produz um DataFrame plano e organizado para análises por grupo.
months = ['jan', 'feb', 'mar']
frames = []
for m in months:
df = pd.DataFrame({'product': ['A', 'B'], 'sales': [100, 200]})
df['month'] = m
frames.append(df)
yearly = pd.concat(frames, ignore_index=True)
print(yearly.groupby('month')['sales'].sum())Verificação rápida
Teste sua compreensão de pd.concat para empilhar DataFrames, conforme apresentado nesta lição.
Recapitulação da lição
Nesta lição, você aprendeu: como empilhar DataFrames verticalmente com pd.concat() e ignore_index=True; como rastrear as origens usando o parâmetro keys; e como join='inner' vs 'outer' controla o tratamento das colunas quando os esquemas são diferentes. Em seguida, exploraremos pd.merge() para realizar joins internos e externos no estilo SQL usando colunas-chave compartilhadas.
Aprenda Python com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 30
- Aulas
- 120
Perguntas Frequentes
A aula “pd.concat para empilhar DataFrames” é grátis?
Sim — o texto completo de “pd.concat para empilhar DataFrames” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Pandas & NumPy Academy, atualize para CoddyKit PRO. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que vou aprender em “pd.concat para empilhar DataFrames”?
Empilhe DataFrames vertical ou horizontalmente com pd.concat, alinhe-os pelo índice ou pelas colunas e trate índices duplicados. Você pratica Pandas & NumPy Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Pandas & NumPy Academy?
Nenhuma experiência prévia é necessária. Pandas & NumPy Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “pd.concat para empilhar DataFrames”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Pandas & NumPy Academy?
Sim. Cada aula de Pandas & NumPy Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- pd.concat para empilhar DataFrames
- pd.merge: junções internas e externas
- Junções à esquerda e à direita
- Fazendo junções pelo índice