Tratamento de dados com pandas

Dados reais raramente chegam prontos para análise. Este material mostra como preparar um DataFrame do pandas: identificar e tratar valores ausentes e linhas duplicadas, substituir, mapear e discretizar valores, limpar textos com métodos de strings e expressões regulares e armazenar rótulos repetidos como dados categóricos. Em seguida, você combina tabelas com merge, join e concat e as remodela entre os formatos longo e largo usando índices hierárquicos, stack, unstack, pivot e melt. Cada método vem acompanhado de um pequeno exemplo resolvido e dos erros aos quais você deve ficar atento, como junções que adicionam linhas sem aviso.

IntermediárioAula 4 de 8 do curso Curso de Análise de dados com Python

O que você vai aprender

  1. Detectar valores ausentes e linhas duplicadas em um DataFrame do pandas, decidir se devem ser removidos, preenchidos ou mantidos e verificar o efeito de cada escolha nos dados.
    • Detectar valores ausentes em um DataFrame
      Reconhecer como o pandas marca dados ausentes, contá-los por coluna e por linha e identificar códigos ocultos que representam valores ausentes.
    • Remover ou preencher valores ausentes
      Remover linhas ou colunas incompletas com dropna ou preencher lacunas com valores fixos, estatísticas, valores vizinhos ou interpolação e escolher o método adequado aos dados.
    • Identificar e remover linhas duplicadas
      Marcar e remover linhas repetidas com duplicated e drop_duplicates, comparar apenas colunas de chave quando necessário e manter a cópia correta de cada registro.
  2. Alterar os valores de uma coluna de forma controlada: substituir códigos, mapear valores por uma tabela de consulta, converter tipos, renomear rótulos e transformar números em grupos, valores escalonados e colunas indicadoras.
    • Substituir, mapear e converter valores
      Trocar valores exatos com replace, transformar valores por meio de um dicionário ou função com map, renomear linhas e colunas e converter texto em números com segurança.
    • Discretizar, escalonar, limitar e codificar valores
      Agrupar números em intervalos com cut e qcut, reescalonar colunas, limitar valores extremos com clip e criar colunas indicadoras para categorias.
  3. Padronizar e pesquisar colunas de texto com o acessor str e expressões regulares e armazenar com eficiência colunas com um conjunto fixo de valores como dados categóricos.
    • Limpar colunas de texto com métodos de strings
      Usar os métodos vetorizados de str para remover espaços das extremidades, alterar maiúsculas e minúsculas, dividir, pesquisar, substituir e combinar textos em todas as linhas de uma coluna de uma vez.
    • Localizar correspondências e extrair padrões com expressões regulares
      Escrever expressões regulares simples e usá-las com contains, extract, findall e replace para testar, extrair e limpar partes estruturadas de texto.
    • Usar o tipo de dados categórico
      Converter colunas com um conjunto limitado de valores em dados categóricos, trabalhar com suas categorias e códigos e usar categorias ordenadas para valores que têm uma ordem natural.
  4. Reunir dados de várias tabelas: associar linhas por colunas de chave ou rótulos de índice com merge e join, preencher lacunas a partir de uma segunda fonte e empilhar tabelas com concat.
    • Unir DataFrames por colunas de chave
      Combinar duas tabelas pela correspondência de valores em colunas de chave com merge, escolher o tipo de junção e verificar se há linhas sem correspondência ou multiplicadas no resultado.
    • Unir pelo índice e preencher lacunas com dados de outra tabela
      Unir por rótulos de índice com join ou left_index e right_index e usar combine_first e alinhamento por rótulos para preencher valores ausentes com dados de uma segunda fonte.
    • Empilhar DataFrames com concat
      Unir tabelas ao longo de linhas ou colunas com pd.concat, controlar o índice e as colunas resultantes e identificar a origem de cada parte.
  5. Trabalhar com tabelas que têm vários níveis de índice e mover dados entre os formatos longo e largo com stack, unstack, pivot e melt.
    • Trabalhar com índices hierárquicos
      Construir e interpretar um MultiIndex, selecionar dados pelos níveis externos e internos, reordenar e ordenar níveis e movê-los entre o índice e as colunas.
    • Remodelar com stack e unstack
      Mover rótulos de colunas para o índice com stack e níveis do índice para as colunas com unstack, e tratar as combinações ausentes que a remodelagem revela.
    • Converter entre os formatos longo e largo com pivot e melt
      Reconhecer os formatos longo e largo, transformar dados longos em uma tabela larga com pivot ou pivot_table e transformar uma tabela larga em dados longos com melt.

Guia de estudo de Tratamento de dados com pandas

5 capítulos

1

Identificar e tratar valores ausentes e duplicatas

Uma lacuna, um zero e um registro repetido têm significados diferentes. Aprenda a quantificar a ausência de dados antes de escolher o que manter, remover ou estimar e a identificar duplicatas usando as colunas que definem um registro. Pequenas tabelas meteorológicas e de pedidos mostram como o pandas toma essas decisões e como elas afetam contagens de linhas, tipos de dados e estatísticas. Cada alteração tem um resultado visível que você pode verificar antes de continuar uma análise.

1.1 Encontre as lacunas antes de calcular

Um dado ausente significa que um valor é desconhecido ou indisponível. O pandas armazena um marcador especial em seu lugar. Detecte o marcador antes de calcular totais ou decidir quais linhas podem ser usadas.

Reconheça os marcadores

O marcador depende do tipo de dados. Colunas de ponto flutuante usam NaN, colunas de data e hora usam NaT, e tipos com suporte a valores ausentes, como "Int64", "boolean" e "string", usam pd.NA. O pandas 3 infere colunas de texto como str, com NaN para texto ausente. O None do Python também é reconhecido como ausente. Use import pandas as pd e import numpy as np nos exemplos.

df.isna() produz uma tabela booleana com as mesmas linhas e colunas de df. Um True marca uma lacuna; df.notna() marca valores presentes. Os nomes alternativos isnull() e notnull() fazem o mesmo. Não compare uma coluna com np.nan: NaN é diferente até de si mesmo, então s == np.nan não detecta as lacunas.

Conte células e linhas afetadas

Considere estas leituras meteorológicas:

citytemp_crain_mm
Lima18,00,0
OsloNaN4,0
Pune31,0NaN
KyivNaNNaN

Um True booleano conta como 1, então df.isna().sum() fornece 0 cidades ausentes, 2 temperaturas e 2 leituras de chuva ausentes. df.isna().mean() fornece as proporções 0,0, 0,5 e 0,5. A proporção de cada coluna usa as quatro linhas como denominador.

Para encontrar linhas afetadas, use df.isna().any(axis=1). Ele retorna False, True, True, True; a soma fornece 3. Já df.isna().sum().sum() fornece 4 células ausentes. Kyiv contribui com duas células, mas apenas uma linha afetada. Use a medida que responde à sua pergunta.

Reconheça códigos ocultos de valores ausentes

Um instrumento pode registrar uma leitura indisponível como -999, "-" ou "unknown". Esses são valores comuns até que você os converta. Após confirmar o significado do código, use df.replace([-999, "unknown"], np.nan). Durante o carregamento de CSV, na_values=[-999, "unknown"] adiciona esses códigos aos marcadores reconhecidos. Campos vazios em CSV e strings comuns como "NA", "n/a" e "NULL" já são reconhecidos por padrão.

Uma leitura de chuva igual a zero pode significar que não choveu, então substituir todos os zeros destruiria observações reais. Além disso, uma string vazia criada na memória, "", e uma string contendo espaços não são consideradas ausentes por isna(). Inspecione o texto armazenado e também as contagens de marcadores. Para incluir categorias ausentes em uma tabela de frequências, use value_counts(dropna=False).

Verifique cálculos e tipos de dados

Para s = pd.Series([4, np.nan, 8]), s.mean() é 6,0: ele usa os dois valores conhecidos. s.count() é 2, enquanto len(s) é 3. Dividir s.sum() por len(s) fornece 4,0 e trata incorretamente a lacuna como zero. A maioria das estatísticas ignora lacunas por padrão; uma coluna inteiramente ausente tem soma 0, mas média NaN.

Uma lacuna também pode alterar o armazenamento. pd.Series([3, None, 5]) torna-se float64, contendo 3,0, NaN e 5,0. Informar dtype="Int64" mantém valores inteiros com <NA> para a lacuna. O I maiúsculo identifica o tipo inteiro do pandas com suporte a valores ausentes.

Principais conclusões

  • Use isna() para detectar marcadores de valores ausentes em diferentes tipos de dados.
  • Conte células ausentes separadamente de linhas com pelo menos uma lacuna.
  • Converta códigos confirmados de valores ausentes; preserve zeros válidos.
  • Verifique o número de valores conhecidos usados em uma estatística.
  • Use "Int64" quando valores inteiros precisarem de um marcador de valor ausente.

1.2 Escolha o que remover ou preencher

Remover uma linha elimina seus valores conhecidos junto com suas lacunas. Preencher uma lacuna mantém a linha, mas introduz uma estimativa. Escolha com base no significado da observação e nas colunas necessárias à análise.

Controle quais linhas são removidas

df.dropna() remove toda linha com algum valor ausente. Na tabela meteorológica, apenas Lima permanece. Restrinja a decisão com subset ou exija um número mínimo de células presentes com thresh.

ChamadaLinhas mantidasMotivo
df.dropna(subset=["temp_c"])Lima, PuneA temperatura está presente
df.dropna(thresh=2)Lima, Oslo, PunePelo menos duas células estão presentes
df.dropna(how="all")Todas as quatroToda linha tem uma cidade

axis="columns" remove colunas com lacunas e mantém apenas city neste caso. Em uma tabela com muitas colunas, a regra padrão para linhas pode descartar grande parte dos dados, pois uma lacuna em qualquer coluna é suficiente. Compare len(df) antes e depois da remoção.

Atribua o resultado

Aprenda a forma com reatribuição: df = df.dropna(). Por padrão, métodos de limpeza retornam um novo objeto. O pandas 3.1 descontinua inplace=True em métodos como dropna, drop_duplicates e rename.

Para uma coluna, escreva df["temp_c"] = df["temp_c"].fillna(0). Uma chamada encadeada como df["temp_c"].fillna(0, inplace=True) nunca atualiza o DataFrame original sob a cópia na escrita do pandas 3. A atribuição torna o destino explícito.

Preencha com um valor compatível

Um dicionário por coluna permite fornecer valores adequados a uma tabela com tipos mistos: df.fillna({"rain_mm": 0, "city": "Unknown"}). Colunas omitidas do dicionário mantêm suas lacunas. Um escalar como 0 é conveniente para uma tabela inteiramente numérica cujas colunas o aceitam. Preencher texto com um número é incompatível; o pandas 3.1 emite um aviso e uma versão futura rejeitará essa operação.

As temperaturas conhecidas são 18,0 e 31,0. A média delas é 24,5, então df["temp_c"].fillna(df["temp_c"].mean()) coloca 24,5 nas duas lacunas. Um valor extremo pode deslocar muito a média; a mediana é menos sensível. Antes de preencher, mantenha um indicador com df["temp_missing"] = df["temp_c"].isna() para que valores estimados e observados continuem distinguíveis.

A imputação pela média reduz a dispersão aparente da coluna. Um valor fixo distante pode aumentá-la. Preencher chuva com 0 afirma que não choveu, o que é inadequado para um sensor que estava desligado.

Use leituras vizinhas quando a ordem importar

ffill() leva o último valor conhecido para a frente; bfill() leva o próximo valor conhecido para trás. Para 12,0, NaN, NaN, NaN, 15,0, o preenchimento para a frente fornece quatro valores 12,0 seguidos de 15,0. ffill(limit=1) preenche apenas a primeira lacuna dessa sequência. Uma lacuna inicial não tem valor anterior e permanece ausente. Use ffill() diretamente; fillna(method="ffill") foi removido no pandas 3.

interpolate() estima valores entre posições vizinhas. Para 10, NaN, NaN, 16, a interpolação linear fornece 10, 12, 14, 16. Ela é adequada para medições que mudam gradualmente em uma ordem significativa. Propagar ou interpolar valores entre cidades sem relação imporia uma relação que as linhas não têm.

Após qualquer operação, execute novamente isna().sum() e verifique as contagens de linhas. Uma chamada de método bem-sucedida informa que o código foi executado; essas verificações mostram o que mudou.

Principais conclusões

  • Use subset, how ou thresh para indicar quais lacunas importam.
  • Atribua os resultados retornados ao DataFrame ou à coluna que você pretende alterar.
  • Escolha valores de preenchimento adequados tanto ao tipo da coluna quanto ao significado da lacuna.
  • Preserve um indicador de valores ausentes antes de preencher com valores estimados.
  • Use métodos baseados em valores vizinhos apenas quando a ordem das linhas tiver significado.
  • Verifique as contagens de linhas e de valores ausentes após a limpeza.

1.3 Identifique o registro antes de remover suas cópias

Duas linhas podem parecer iguais sem descrever o mesmo evento. Antes de remover duplicatas, decida quais valores identificam um registro. Um identificador de pedido pode identificar um pedido; cliente e data, por si só, podem identificar várias compras legítimas.

Marque as cópias extras

df.duplicated() retorna um valor booleano por linha. Por padrão, ele compara todas as colunas, mantém a primeira ocorrência e marca as cópias posteriores como True. Somar o resultado conta as cópias extras, não todos os membros dos grupos repetidos.

Considere seis linhas de pedidos com os identificadores 101, 102, 102, 103, 104, 104. As duas linhas de 102 são idênticas. As duas linhas de 104 têm pesos registrados diferentes, 0,5 kg e 0,8 kg. Comparando todas as colunas, há uma cópia extra: df.duplicated().sum() é 1. df.drop_duplicates() mantém cinco linhas porque as duas linhas diferentes de 104 não são cópias exatas.

Compare as colunas que definem a identidade

df.duplicated(subset=["order_id"]) compara apenas os identificadores. Ele marca o segundo 102 e o segundo 104, fornecendo duas cópias extras. Os valores das outras colunas não afetam mais essa decisão. Inspecione os pesos divergentes antes de escolher qual registro de pedido manter.

Valor de keepComportamento no grupo repetido
"first"Mantém a primeira linha na ordem atual
"last"Mantém a última linha na ordem atual
FalseRemove todos os membros de um grupo repetido

df.drop_duplicates(subset="order_id", keep="last") mantém a versão de 0,8 kg do pedido 104 nessa ordem. Manter a última linha não significa, por si só, manter o registro mais recente. Estabeleça essa ordem primeiro:

latest = df.sort_values("updated").drop_duplicates(
    subset="customer_id", keep="last"
)

Ordenar por updated coloca registros mais antigos antes dos mais recentes. A verificação de duplicatas compara então apenas customer_id, de modo que horários de atualização diferentes não impedem que duas linhas sejam reconhecidas como versões do mesmo cliente.

Separe valores de linha de rótulos de índice

Esses métodos comparam valores, ignorando rótulos de índice. Linhas idênticas com rótulos 4 e 9 ainda contam como duplicatas. Valores ausentes em posições correspondentes são considerados iguais nessa verificação. Para testar os próprios rótulos repetidos, use df.index.duplicated().

A comparação exata também preserva diferenças de maiúsculas, minúsculas e caracteres em branco. Os valores “ Lisbon”, “lisbon” e “LISBON ” são distintos. Limpe com .str.strip().str.lower() antes de verificar duplicatas quando essas grafias representarem a mesma cidade. Caso contrário, nunique() contará três nomes para um lugar.

Verifique a unicidade onde a relação exigir

Uma tabela de consulta deve ter uma linha por chave de consulta quando cada registro precisar receber um conjunto de informações. lookup["customer_id"].is_unique verifica esse requisito. Identificadores de clientes repetidos em uma tabela de pedidos são normais porque um cliente pode fazer vários pedidos.

Se uma chave de consulta se repetir, uma junção posterior repetirá cada pedido correspondente para cada linha de consulta correspondente. Remover duplicatas dos pedidos descartaria compras reais sem corrigir a tabela de consulta. Verifique a chave pretendida na tabela correta, inspecione registros conflitantes e compare a contagem de linhas após a remoção.

Principais conclusões

  • Defina um registro com as colunas de chave corretas antes de remover cópias.
  • duplicated().sum() conta cópias posteriores com o padrão keep="first".
  • Ordene pelo horário de atualização antes de manter o registro mais recente.
  • Duplicatas nos valores das linhas e rótulos de índice repetidos exigem verificações separadas.
  • A unicidade da chave de consulta evita a multiplicação acidental de linhas em junções.
2

Transformar valores por substituição, mapeamento e discretização em intervalos

Transformar uma coluna altera o significado de seus valores ou a forma como são representados. Escolha entre substituições exatas, consultas, conversão numérica, intervalos, valores escalonados e colunas indicadoras. Você examinará as entradas e saídas de cada método, incluindo o que acontece com valores sem correspondência e valores nos limites, para que uma operação conveniente não altere categorias nem perca medições utilizáveis sem aviso.

2.1 Altere valores e rótulos de forma consciente

Uma substituição edita valores correspondentes, uma consulta transforma valores e uma renomeação altera rótulos. Essas tarefas podem parecer semelhantes no código, mas produzem resultados diferentes quando um valor está ausente de um dicionário.

Substitua valores exatos

s.replace("N/A", np.nan) altera apenas células iguais a "N/A". Uma lista pode indicar vários valores antigos: s.replace(["-", "?"], np.nan). Um dicionário fornece substituições distintas, como s.replace({"M": "male", "F": "female"}). Valores sem correspondência permanecem como estavam.

Para uma tabela inteira, um dicionário aninhado restringe a alteração a uma coluna: df.replace({"status": {0: "open", 1: "closed"}}). Isso evita alterar zeros e uns não relacionados em outras partes. Atribua o resultado retornado para manter a alteração.

replace busca correspondências em células inteiras. Com “Main St” e “St”, s.replace("St", "Street") altera apenas “St”. Para editar partes de uma string, use s.str.replace("St", "Street", regex=False), que também produz “Main Street”.

Transforme valores com uma consulta

Para os códigos “PT”, “JP” e “KE”, compare o mesmo dicionário em dois métodos:

MétodoPTJPKE
s.map({"PT": "Portugal", "JP": "Japan"})PortugalJapanNaN
s.replace({"PT": "Portugal", "JP": "Japan"})PortugalJapanKE

Um dicionário passado a map define as saídas disponíveis. Uma chave ausente não tem saída e torna-se um valor ausente. Verifique isna().sum() depois para tornar visível uma consulta incompleta.

map também aceita uma função: s.map(lambda x: x * 1000) converte valores em quilômetros para metros. Para essa operação aritmética, s * 1000 é mais simples e rápido porque opera sobre a coluna inteira. DataFrame.map aplica uma função célula por célula; ele substitui o método applymap, que foi removido.

Converta texto em números

astype solicita um tipo de dados, como "float64", "Int64" ou "category". Ele gera um erro se um valor não puder ser convertido. Para os textos "12", "7.5" e "n/a", pd.to_numeric(s, errors="coerce") produz 12,0, 7,5 e NaN. A coerção de tipo preserva números que podem ser interpretados, mas exige a inspeção das falhas.

A formatação pode impedir a conversão mesmo quando o número é válido. Para “1,200” e “950”, primeiro remova o separador de milhares:

cleaned = s.str.replace(",", "", regex=False)
numbers = pd.to_numeric(cleaned, errors="coerce")
failed = s.notna() & numbers.isna()

Aqui, failed marca valores que estavam presentes antes da conversão, mas se tornaram ausentes. Comparar apenas as contagens de valores ausentes fornece um total útil; a máscara também localiza o texto original a ser inspecionado. Remova unidades conhecidas de textos de medições da mesma forma cuidadosa antes de convertê-los.

Renomeie os rótulos

df.rename(columns={"Qty": "quantity"}) altera um cabeçalho de coluna, deixando suas células inalteradas. df.rename(columns=str.lower) coloca todos os cabeçalhos em minúsculas. Uma sequência como df.columns.str.strip().str.lower().str.replace(" ", "_", regex=False) transforma “Total KG ” em total_kg; atribua-a a df.columns.

Use replace ou map para valores dentro de uma coluna. Use rename para os rótulos pelos quais você seleciona esses valores.

Principais conclusões

  • replace preserva valores sem correspondência; map com dicionário os torna ausentes.
  • Use .str.replace para editar parte de cada valor de texto.
  • Prefira aritmética vetorizada para cálculos simples em colunas.
  • Inspecione novos valores ausentes após a coerção numérica.
  • rename altera rótulos e deixa os valores dos dados inalterados.

2.2 Agrupe e reescalone medições

Algumas análises precisam de medições exatas, enquanto outras precisam de grupos ou escalas numéricas comparáveis. Mantenha claro o significado original: a discretização cria categorias, o escalonamento altera a escala numérica e a limitação substitui valores extremos.

Coloque valores em intervalos

pd.cut(ages, [18, 30, 45, 65]) usa os intervalos (18, 30], (30, 45] e (45, 65]. O parêntese exclui o extremo esquerdo; o colchete de fechamento inclui o extremo direito. As idades 19, 25 e 30 entram no primeiro intervalo, 41 no segundo e 64 no terceiro. A idade 18 torna-se ausente porque está no extremo esquerdo excluído.

include_lowest=True inclui esse valor mínimo no primeiro intervalo. Já right=False cria intervalos fechados à esquerda, como [18, 30), então 30 entra no segundo intervalo. Valores fora de todos os intervalos permanecem ausentes. Teste os limites exatos e também valores típicos entre eles.

Deve haver um rótulo por intervalo, um a menos que o número de limites. Com labels=["18-30", "31-45", "46-65"] e include_lowest=True, as seis idades acima fornecem as contagens 4, 1 e 1. Esses rótulos descrevem idades em números inteiros; os limites dos intervalos continuam determinando a atribuição.

Escolha limites ou tamanhos dos grupos
OperaçãoO que controlaFinalidade útil
pd.cut(x, [18, 30, 45, 65])Limites fixosIntervalos significativos
pd.cut(x, 4)Quatro intervalos de mesma amplitudeComparar faixas de valores
pd.qcut(x, 4)Quatro grupos com contagens aproximadamente iguaisComparar posições nos dados

Para 2, 4, 6, 8, 10, 12, 14, 16, qcut fornece dois valores por grupo de quartil. Grupos com contagens iguais não precisam cobrir amplitudes numéricas iguais.

Escalone sem criar grupos

O escalonamento mínimo-máximo usa (x - x.min()) / (x.max() - x.min()). Para 10, 20, 40, a amplitude é 30: os resultados são 0, aproximadamente 0,333 e 1. Tanto o mínimo quanto o máximo são necessários; dividir apenas pelo máximo é uma operação diferente. Uma coluna constante tem amplitude zero, então essa expressão não pode fornecer uma dispersão escalonada útil para ela.

A padronização usa (x - x.mean()) / x.std(). Para 10, 20, 30, a média é 20 e o desvio padrão amostral padrão do pandas é 10. Subtrair 20 e dividir por 10 fornece os escores z -1, 0 e 1. Um escore z descreve a distância da média em unidades de desvio padrão, não um rótulo de intervalo.

Limite e codifique

pd.Series([5, 12, 250, 8]).clip(upper=100) fornece 5, 12, 100, 8. Diferentemente de um filtro, clip mantém a linha e substitui o número extremo. Inspecione valores grandes com describe() ou um filtro antes de limitá-los: uma medição grande real ainda é um dado.

pd.get_dummies(s) cria uma coluna indicadora booleana por categoria. Com vermelho, verde, vermelho, azul, cada linha é True apenas na coluna de sua cor. Use dtype=int para zeros e uns. Valores ausentes produzem indicadores todos falsos, a menos que dummy_na=True adicione uma coluna de valores ausentes. Para regressão por mínimos quadrados ordinários com intercepto, drop_first=True remove uma coluna de categoria redundante; outros modelos podem manter todas as categorias. Com uma categoria por linha, o conjunto completo de indicadores soma a constante 1 do intercepto, criando dependência linear.

Para células que contêm várias etiquetas, s.str.get_dummies(sep="|") divide um valor como “Action|Comedy” em indicadores separados. Intervalos criados por discretização também podem ser passados a get_dummies, produzindo uma coluna para cada faixa.

Principais conclusões

  • Verifique os extremos dos intervalos e os valores fora deles com cut.
  • cut controla intervalos; qcut busca contagens semelhantes nos grupos.
  • O escalonamento mínimo-máximo e os escores z preservam valores numéricos em uma escala alterada.
  • clip limita valores sem remover linhas.
  • Colunas indicadoras representam a participação em categorias sem inventar uma ordem numérica.
  • Trate categorias ausentes explicitamente quando seus indicadores forem importantes.
3

Limpar dados textuais e categóricos

Valores de texto precisam de grafia e espaçamento consistentes antes de funcionar como categorias ou chaves. Aplique métodos de strings a uma coluna inteira, extraia partes estruturadas com expressões regulares e escolha um tipo de dados categórico quando um pequeno conjunto de rótulos se repetir. Os exemplos relacionam a limpeza de texto à verificação de duplicatas e às junções, mostrando como os códigos armazenados e a ordem das categorias diferem das palavras que os estudantes veem em uma tabela.

3.1 Torne os valores de texto consistentes

Uma pessoa vê a mesma cidade em “ Lisbon”, “lisbon” e “LISBON ”. O pandas vê três strings diferentes. Limpar uma coluna de texto fornece um conjunto consistente de valores para comparação em contagens, verificações de duplicatas e junções posteriores.

Aplique métodos de strings a uma Series

"Lima ".strip() do Python funciona em uma string. Para uma coluna, use o acessor .str: s.str.strip() remove caracteres em branco das extremidades de cada valor não ausente. s.lower() gera um AttributeError porque a própria Series não tem um método lower. Use s.str.lower().

O pandas 3 normalmente infere texto como tipo str, substituindo o antigo padrão object. O tipo str contém texto e valores ausentes, com NaN para texto ausente. Métodos de strings funcionam nos dois tipos. Atribua texto a uma coluna str; converta primeiro um número em texto se ele pertencer à coluna como texto.

Combine operações de limpeza compatíveis e atribua o resultado:

df["city"] = df["city"].str.strip().str.lower()

As três grafias de Lisboa tornam-se “lisbon”. strip() remove caracteres em branco das extremidades, não espaços dentro de um nome. upper() coloca todas as letras em maiúsculas, enquanto title() coloca a primeira letra de cada palavra em maiúscula, transformando “new york” em “New York”. Escolha uma forma consistente para chaves e contagens.

Divida strings estruturadas

Para “Silva, Ana” e “Tanaka, Yui”, s.str.split(", ") retorna listas como ["Silva", "Ana"]. Acrescente expand=True para produzir colunas separadas. Obtenha uma parte de cada lista com .str[0] ou .str.get(1).

Se apenas o primeiro separador deve dividir um valor, use n=1. Dividir “a,b,c” nas vírgulas com n=1 fornece “a” e “b,c”. Sem limite, fornece três partes. Corresponda exatamente ao separador, incluindo qualquer espaço que faça parte do formato.

Pesquise e filtre

s.str.contains("lis", case=False) procura texto em qualquer posição, ignorando maiúsculas e minúsculas. s.str.startswith("ID") verifica o início; s.str.endswith(".csv") verifica o fim. Os resultados booleanos podem selecionar linhas:

mask = df["city"].str.contains("san", case=False, na=False)
selected = df[mask]

Para o tipo str do pandas 3, texto ausente fornece False nesses testes de pesquisa. Escrever na=False também deixa claro o tratamento pretendido ao usar dados de strings com suporte a valores ausentes. contains interpreta um padrão de expressão regular por padrão; acrescente regex=False para texto literal que contenha caracteres especiais.

Substitua partes e construa novas strings

s.str.replace("kg", "", regex=False) remove “kg” onde quer que apareça. s.replace("kg", "") altera apenas células que são exatamente “kg”. Essa distinção importa para valores como “12 kg”.

str.replace trata seu texto de pesquisa literalmente por padrão. Para “3.5 kg”, .str.replace(".", "", regex=False) remove o ponto e fornece “35 kg”. Com regex=True, o ponto é um padrão para quase qualquer caractere e remove todos os caracteres neste exemplo de uma linha. Nunca use essa alteração para interpretar uma medição decimal.

s.str.len() conta caracteres; um valor ausente produz NaN e pode tornar o resultado uma coluna de ponto flutuante. s.str[:3] extrai os três primeiros caracteres. Para combinar colunas, df["first"] + " " + df["last"] une Ana e Silva como “Ana Silva”; str.cat é outro método de união. Cada operação retorna um resultado, então salve-o na coluna que pretende usar.

Principais conclusões

  • Use .str para aplicar métodos de texto a uma Series.
  • Remova caracteres em branco das extremidades e padronize maiúsculas e minúsculas antes de associar chaves de texto.
  • Controle a saída da divisão com expand e n.
  • Escolha explicitamente pesquisas literais ou com expressões regulares para caracteres especiais.
  • Reatribua o texto limpo para manter a alteração.

3.2 Extraia as partes descritas por um padrão de texto

Uma expressão regular, ou regex, descreve um padrão em texto. Ela pode reconhecer uma quantidade mesmo quando o número de dígitos ou o espaçamento varia. Comece com um padrão pequeno cujas partes você consiga explicar.

Interprete os elementos do padrão
PadrãoSignificado
\dUm dígito
\wUm caractere de palavra: letra, dígito ou sublinhado
\sUm caractere em branco
[A-Z]Uma letra maiúscula nesse intervalo
+Uma ou mais ocorrências do item anterior
*Zero ou mais ocorrências do item anterior
?O item anterior é opcional
{4}Exatamente quatro repetições
(…)Um grupo de captura

Escreva padrões Python como strings brutas, por exemplo, r"\d+", para que o Python preserve suas barras invertidas. Um ponto corresponde, por padrão, a qualquer caractere exceto uma quebra de linha. Escape-o como r"\." para encontrar um ponto literal. Para uma pesquisa de texto simples, regex=False evita completamente a interpretação como padrão.

Escolha quanto do texto deve corresponder

contains encontra um padrão em qualquer posição, match começa pelo início e fullmatch exige que o valor inteiro corresponda. Para “123a”, s.str.contains(r"\d+") e s.str.match(r"\d+") encontram correspondências, mas s.str.fullmatch(r"\d+") falha. Use o teste da string inteira ao verificar um código completo. case=False ou flags=re.IGNORECASE após import re permite ignorar maiúsculas e minúsculas onde houver suporte.

Capture uma medição

Considere “Rice 5 kg”, “Flour 2kg”, “Salt” e “Beans 12 kg, 3 kg”. O padrão r"(\d+)\s*kg" significa um ou mais dígitos capturados como um grupo, seguidos de zero ou mais espaços e depois “kg”.

quantity = s.str.extract(r"(\d+)\s*kg", expand=False)
quantity = pd.to_numeric(quantity)

As strings extraídas são “5”, “2”, um valor ausente e “12”. A conversão fornece os valores numéricos 5,0, 2,0, NaN e 12,0. extract obtém a primeira correspondência em cada linha, então a segunda quantidade na descrição de feijão não é incluída. Sem expand=False, um único grupo retorna um DataFrame de uma coluna.

Grupos nomeados identificam a saída. s.str.extract(r"(?P<year>\d{4})-(?P<month>\d{2})") encontra “2024-03” dentro de “Report 2024-03 final” e retorna as colunas de texto year e month. O padrão reconhece a estrutura dos dígitos; a conversão numérica é uma etapa separada.

Encontre todas as correspondências ou limpe por padrão

findall(r"\d+") fornece uma lista por linha, incluindo ["12", "3"] para o texto do feijão e [] para “Salt”. count(r"\d+") conta as correspondências. extractall fornece uma linha por correspondência com um nível extra de índice chamado match.

Com regex=True, s.str.replace(r"\s+", " ", regex=True) reduz sequências de caracteres em branco a um espaço. r"\D" significa um caractere que não é dígito, então removê-lo transforma “+351 912-345-678” em “351912345678”. As formas maiúsculas \S e \W também negam as classes de caracteres em branco e de caracteres de palavra.

A repetição é gulosa por padrão. Em "<b>x</b>", r"<.*>" vai do primeiro símbolo de abertura até o último símbolo de fechamento. Remover essa correspondência remove tudo. O padrão não guloso r"<.*?>" corresponde a cada tag separadamente e deixa “x”. Verifique saídas de exemplo antes de usar um padrão em uma coluna inteira.

Principais conclusões

  • Use strings brutas para preservar as barras invertidas das expressões regulares.
  • Escolha contains, match ou fullmatch conforme o alcance pretendido.
  • Grupos de captura retornam texto; converta números extraídos separadamente.
  • extract obtém a primeira correspondência; findall e extractall mantêm várias correspondências.
  • Escape caracteres especiais para obter correspondências literais em expressões regulares.
  • Verifique padrões gulosos com exemplos que tenham várias correspondências possíveis.

3.3 Armazene rótulos repetidos como categorias

Uma coluna com poucos valores repetidos muitas vezes pode usar o tipo de dados category. Ele armazena os rótulos distintos uma vez e representa cada linha com um pequeno código inteiro. O valor visível continua sendo o rótulo.

Entenda categorias e códigos

Para os tamanhos M, S, L, M, M, s.astype("category") infere as categorias L, M, S em ordem alfabética. Os códigos são 1, 2, 0, 1, 1. Use s.cat.categories para inspecionar os rótulos e s.cat.codes para inspecionar os identificadores. Um código 0 significa a primeira categoria armazenada; não é uma quantidade medida.

Rótulos repetidos podem economizar bastante memória. Com até 126 categorias, os códigos usam um byte cada; com 127 categorias, usam dois bytes. Em uma configuração com pandas 3.1 e PyArrow, três nomes de países repetidos em 3.000.000 de linhas usaram cerca de 3 MB como dados categóricos, cerca de 42 MB como str e cerca de 165 MB como object. O mecanismo de armazenamento de texto afeta esses números. Uma coluna com quase todos os valores únicos não se beneficia do armazenamento de uma lista de categorias mais um código por linha.

Defina uma ordem significativa

A ordem alfabética dos tamanhos coloca L antes de M, que vem antes de S. Defina explicitamente a ordem real dos tamanhos:

size_type = pd.CategoricalDtype(["S", "M", "L"], ordered=True)
sizes = s.astype(size_type)

Agora a ordenação segue S, M, L, comparações como sizes > "S" fazem sentido, e sizes.max() é “L” quando L ocorre. Para rótulos não ordenados, como países, testes de igualdade funcionam, mas comparações de maior que geram um TypeError. as_ordered() usa a sequência de categorias existente; inspecione-a antes de declarar que essa sequência tem significado.

Altere os rótulos permitidos

Você não pode atribuir “XL” a dados categóricos que permitem apenas S, M e L. Primeiro atribua o resultado ampliado, sizes = sizes.cat.add_categories("XL"), depois atribua o novo valor.

Converter texto para uma lista fixa de categorias pode transformar valores não listados em valores ausentes. O pandas 3.1 avisa que essa conversão com perda de dados passará a ser um erro. Verifique os valores de origem com value_counts() antes da conversão, especialmente após limpar grafias.

Os métodos .cat têm finalidades diferentes:

  • rename_categories({"S": "small"}) altera um rótulo mantendo seus membros.
  • remove_categories("L") remove um rótulo permitido e torna ausentes os valores L existentes.
  • set_categories([...]) substitui a lista inteira de categorias.
  • reorder_categories([...], ordered=True) altera a ordem sem alterar quais rótulos são permitidos.
  • remove_unused_categories() remove rótulos sem membros no momento.

value_counts() exibe todas as categorias permitidas, incluindo as que têm zero observações. Com um tipo S/M/L contendo apenas S e M, L ainda aparece com contagem 0. Isso revela um grupo vazio para o qual dados de texto comuns não têm um rótulo armazenado.

Mantenha as categorias úteis nas etapas seguintes

cut produz intervalos categóricos, e get_dummies converte a participação em categorias em colunas indicadoras. Fornecer códigos de países não ordenados a um modelo como números imporia uma ordem e distâncias artificiais. Indicadores evitam essa interpretação.

Concatenar colunas categóricas com listas de categorias diferentes normalmente faz com que o tipo categórico se perca. Alinhe primeiro suas listas de categorias ou use pd.concat(..., union_categories=True) no pandas 3.1 quando a intenção for combinar as listas. Inspecione tanto o tipo de dados resultante quanto a ordem das categorias.

Principais conclusões

  • Dados categóricos armazenam uma lista de rótulos e identificadores inteiros.
  • Declare explicitamente a ordem das categorias quando a classificação tiver significado.
  • Adicione uma categoria antes de atribuir um novo rótulo.
  • Remover uma categoria utilizada torna seus valores ausentes.
  • Use indicadores para categorias não ordenadas em modelos numéricos.
  • Alinhe as listas de categorias ou una-as intencionalmente antes da concatenação.
4

Combinar DataFrames

Combinar tabelas pode adicionar informações, adicionar observações ou preencher lacunas com dados de uma fonte de reserva. Essas são tarefas diferentes. Associe chaves explícitas com merge, trabalhe com rótulos de índice por meio de join e combine_first e empilhe partes compatíveis com concat. Antes de confiar em um resultado, preveja quais linhas devem permanecer e quantas correspondências cada chave deve produzir; os exemplos mostram por que um aumento inesperado frequentemente começa com uma chave de consulta repetida.

4.1 Preveja o que uma junção manterá

Uma junção associa linhas por valores de chave e coloca suas informações lado a lado. A chave deve descrever a mesma coisa nas duas tabelas, como o identificador do cliente em um pedido e o identificador do cliente em uma tabela de consulta.

Indique a chave e escolha a junção

Use orders.merge(customers, on="customer_id"). Sem on, o pandas usa todos os nomes de colunas compartilhados pelas duas tabelas. Uma coluna compartilhada sem relação com a chave, como date, poderia impedir correspondências válidas de clientes.

Suponha que os pedidos tenham os identificadores de clientes 10, 20, 20, 30, 50. A tabela de clientes tem uma linha para cada um dos identificadores 10, 20, 30, 40.

howO que permaneceLinhas no resultado
"inner"Chaves correspondentes nos dois lados4
"left"Todas as linhas à esquerda e suas correspondências5
"right"Todas as linhas à direita e suas correspondências5
"outer"Chaves de qualquer um dos lados6
"cross"Todos os pares de linhas da esquerda e da direita20

A junção interna é o padrão. Em uma junção à esquerda, os dados do cliente 50 estão ausentes. Uma junção à direita inclui o cliente 40 sem pedido, além dos dois pedidos de 20. Uma junção externa completa inclui as duas chaves sem correspondência. Uma junção cruzada não precisa de chave porque combina intencionalmente todas as linhas. O pandas 3 também oferece left_anti e right_anti para linhas sem chave correspondente no outro lado.

Verifique quantas correspondências uma linha pode ter

Duas linhas à esquerda para a chave 20 e três linhas à direita para a chave 20 produzem seis pares. A junção não escolhe uma única linha à direita. No exemplo, adicionar uma segunda linha de consulta de cliente para 20 aumenta o resultado da junção interna de quatro para seis linhas.

Expresse a relação pretendida com validate:

merged = orders.merge(
    customers, on="customer_id", how="left",
    validate="many_to_one"
)

Isso permite muitos pedidos por cliente, mas exige identificadores de clientes únicos à direita. Uma chave repetida à direita gera MergeError. one_to_one exige unicidade nos dois lados; one_to_many a exige à esquerda. many_to_many permite repetições nos dois lados e não verifica a unicidade.

Investigue linhas sem correspondência

Uma junção externa completa com indicator=True adiciona _merge. Aqui, suas contagens são quatro both, uma left_only e uma right_only. São linhas, não chaves distintas: pedidos repetidos podem produzir várias linhas both para um cliente.

Para contar chaves distintas sem correspondência do lado dos pedidos, use m.loc[m["_merge"] == "left_only", "customer_id"].nunique(). Inspecionar as linhas pode revelar entradas ausentes na tabela de consulta ou texto inconsistente.

Controle nomes e formatos das chaves

Se as chaves tiverem nomes diferentes, use left_on="customer_id", right_on="id". Ambas as colunas de chave permanecem disponíveis. Várias chaves podem ser associadas em conjunto com on=["city", "year"]; ambas devem coincidir.

Nomes compartilhados por colunas que não são chaves recebem _x e _y. Escolha sufixos significativos como suffixes=("_order", "_ship") para deixar as origens claras.

As chaves precisam ter tipos de dados compatíveis e valores iguais. O valor numérico 1 pode corresponder ao valor numérico 1,0, mas colunas de chave inteiras e de texto podem gerar um erro de junção. Converta seus formatos de forma consciente. “ana” e “Ana ” são diferentes como texto; padronize maiúsculas, minúsculas e espaços nas extremidades antes da junção quando identificarem a mesma pessoa.

Chaves ausentes também precisam de inspeção: o pandas associa chaves ausentes de um lado a chaves ausentes do outro. Se ambos os lados tiverem várias dessas linhas, essas correspondências também podem se multiplicar.

Principais conclusões

  • Indique explicitamente as chaves de junção.
  • Escolha o tipo de junção conforme as linhas de origem que devem permanecer.
  • Chaves repetidas produzem todos os pares correspondentes.
  • Use validate para verificar a relação pretendida entre as chaves.
  • Use uma junção externa completa com um indicador para inspecionar linhas sem correspondência.
  • Verifique valores, formatos e sufixos das chaves antes de usar o resultado.

4.2 Combine valores em rótulos de índice correspondentes

Um índice pode conter a chave que você deseja associar. O pandas usa esses rótulos ao unir tabelas, preencher valores ausentes ou somar duas Series. A posição da linha, por si só, não determina as correspondências.

Faça junções por rótulos de índice

left.join(right) associa os dois índices e usa uma junção à esquerda por padrão. Já merge usa uma junção interna por padrão. Você também pode escrever left.merge(right, left_index=True, right_index=True) quando ambas as chaves estiverem no índice.

Suponha que stations tenha os rótulos de índice A, B, C e as altitudes 120, 850, 15 m. Uma tabela de leituras tem os rótulos de índice de estação A, B, B, D. readings.join(stations) mantém quatro linhas e adiciona as altitudes 120, 850, 850 e NaN. As duas leituras de B recebem a altitude de B. Com how="inner", apenas as três leituras de A e B permanecem.

Se as leituras mantiverem identificadores de estação em uma coluna comum, use readings.join(stations, on="station"). A coluna esquerda corresponde ao índice direito. A forma equivalente com merge é readings.merge(stations, left_on="station", right_index=True, how="left").

Deixe explícita a localização da chave

set_index("station") move a coluna de estação para o índice. reset_index() a restaura como uma coluna comum. Essas operações permitem escolher um formato que facilite a inspeção da correspondência. left.join([t1, t2]) pode unir de uma vez várias tabelas que compartilham rótulos de índice.

Se ambas as tabelas unidas contiverem uma coluna que não é chave, como source, join gerará um ValueError, a menos que você diferencie os nomes. No pandas 3.1, escreva suffixes=("_left", "_right"); isso substitui os argumentos antigos lsuffix e rsuffix. Os sufixos mantêm ambas as versões sem decidir qual valor é o correto.

Preencha lacunas com uma fonte de reserva

a.combine_first(b) mantém os valores conhecidos de a, preenche suas lacunas com valores de b nos rótulos correspondentes e inclui rótulos encontrados apenas em b.

Rótuloaba.combine_first(b)
a1101
bNaN2020
c3303
dausente4040

O resultado mantém 1 e 3 porque a primeira fonte já os conhece. Ele usa 20 para preencher a lacuna e adiciona o rótulo d com 40. Inverter a chamada altera qual fonte tem prioridade. Isso é útil quando uma fonte principal de dados deve ter prioridade sobre uma fonte de reserva, mesmo quando suas linhas estão em ordens diferentes.

Reconheça o alinhamento na aritmética

Considere x com a = 5 e b = 7; e y com b = 1 e c = 2. x + y fornece b = 8, com resultados ausentes em a e c porque falta um operando em cada caso. Ele não soma o primeiro valor de x ao primeiro valor de y.

x.add(y, fill_value=0) fornece zero para o lado ausente, produzindo a = 5, b = 8, c = 2. Use essa regra quando uma contribuição ausente deve contar como zero. O alinhamento por rótulos é a mesma ideia que organiza essas operações, mas suas regras para os valores diferem: join adiciona colunas, combine_first preenche lacunas e a aritmética calcula com valores correspondentes.

Principais conclusões

  • join usa por padrão uma correspondência de índices à esquerda; merge usa uma junção interna.
  • Em join(on="station"), a coluna esquerda corresponde ao índice direito.
  • Use sufixos para distinguir colunas compartilhadas que não são chaves.
  • combine_first dá prioridade aos valores conhecidos do objeto que chama o método.
  • A aritmética alinha por rótulo; fill_value controla contribuições ausentes.

4.3 Empilhe tabelas compatíveis com concat

Arquivos mensais normalmente contêm mais linhas do mesmo tipo de observação. A concatenação reúne essas partes em uma tabela. Ela alinha rótulos no outro eixo; não procura valores correspondentes de chaves de clientes ou pedidos.

Empilhe linhas e alinhe colunas

pd.concat([jan, feb]) empilha linhas porque o padrão é axis=0. Suponha que janeiro tenha três viagens com as colunas trip e km, enquanto fevereiro tem duas viagens com trip, km e note. O resultado tem cinco linhas e três colunas. As células ausentes de note em janeiro tornam-se NaN.

join="outer" é o padrão: ele mantém a união dos nomes de colunas. join="inner" mantém apenas nomes compartilhados, então o resultado tem cinco linhas e as duas colunas trip e km. Ele ainda inclui as cinco observações; a configuração de join controla o outro eixo.

A ordem das colunas nas partes não determina a correspondência. Os nomes exatos determinam. Se uma parte usa km e a outra usa Km, o resultado contém duas colunas parcialmente vazias. Renomeie os cabeçalhos antes de concatenar.

Decida o que os rótulos de linha devem significar

Os índices originais permanecem por padrão. Com os índices iniciais 0, 1, 2 e 0, 1, o resultado repete os rótulos 0 e 1. result.loc[0] seleciona duas linhas. Use ignore_index=True quando esses números não tiverem significado e você quiser novos rótulos de 0 a 4.

Quando a identidade da origem importar, use um nível externo de índice:

result = pd.concat(
    [jan, feb], keys=["jan", "feb"], names=["month", "row"]
)

Agora result.loc["feb"] seleciona as duas linhas de fevereiro. keys preserva a origem em um MultiIndex. No pandas 3, combinar keys com ignore_index=True gera ValueError; escolha rótulos de origem ou um novo índice simples para essa operação.

Coloque colunas lado a lado

pd.concat([x, y], axis=1) alinha linhas por rótulo de índice. Para x com a = 1, b = 2 e y com b = 3, c = 4, o resultado tem as linhas a, b, c. A coluna x está ausente em c, e y está ausente em a. Com join="inner", apenas b permanece.

OperaçãoAcrescenta ao longo deRótulos alinhados por
concat(..., axis=0)LinhasNomes de colunas
concat(..., axis=1)ColunasÍndices de linhas
merge(..., on="id")Pares de linhas correspondentesValores das colunas de chave
Verifique o armazenamento e reúna as partes com eficiência

Uma coluna que mistura valores numéricos e texto pode se tornar do tipo object. Se dados comuns int64 do NumPy receberem uma lacuna, eles se tornam float64; o tipo "Int64" do pandas com suporte a valores ausentes pode manter inteiros com <NA>. Alinhe os tipos de dados antes de combinar quando a coluna tiver um tipo definido.

DataFrame.append foi removido no pandas 2.0. Para muitos arquivos, reúna DataFrames em uma lista e chame pd.concat uma vez após o laço. Reconstruir um resultado crescente em cada iteração copia repetidamente os dados acumulados e fica lento.

Verifique se o comprimento de uma concatenação de linhas é igual à soma dos comprimentos das entradas. Depois, inspecione nomes de colunas, contagens de valores ausentes e tipos de dados.

Principais conclusões

  • A concatenação de linhas alinha nomes de colunas e soma as contagens de linhas de entrada.
  • join escolhe os rótulos compartilhados ou todos os rótulos no outro eixo.
  • Use ignore_index para rótulos descartáveis ou keys para identificar a origem.
  • A concatenação de colunas alinha os índices das linhas.
  • Reúna muitas partes primeiro e concatene uma vez.
5

Remodelar dados com índices hierárquicos, pivot e melt

As mesmas medições podem ser organizadas como linhas, colunas ou níveis de um índice. Use um MultiIndex para identificar observações com várias chaves e depois mova essas chaves com stack e unstack ou com pivot e melt. Acompanhe quais rótulos identificam uma célula e se eles são únicos. Isso torna a remodelagem previsível e permite distinguir uma combinação ausente de um zero medido ou de um par de registros que precisa de agregação explícita.

5.1 Selecione linhas com mais de um nível de índice

Um MultiIndex fornece vários rótulos a cada linha. Uma linha de vendas pode ser identificada tanto pela cidade quanto pelo ano, escritos como uma tupla, por exemplo, ("Osaka", 2024). Cada rótulo tem um nível, e a ordem desses níveis importa para a seleção.

Construa e nomeie o índice

df.set_index(["city", "year"]) move essas colunas para o índice. pd.MultiIndex.from_product([["Lima", "Osaka"], [2024, 2025]], names=["city", "year"]) constrói todas as combinações dos rótulos fornecidos. A concatenação com keys também adiciona um nível.

Para os exemplos, sales tem estes pares de índice e valores:

cityyearsales
Osaka2024120
Osaka2025135
Lima202480
Lima202595

Após definir os dois níveis de índice, df.index.names é ["city", "year"]. rename_axis(["town", "yr"]) altera os nomes dos níveis sem alterar seus valores.

Selecione um rótulo externo ou uma tupla completa

df.loc["Osaka"] seleciona as duas linhas de Osaka. O nível da cidade selecionada é removido, deixando 2024 e 2025 como índice. df.loc[("Lima", 2025), "sales"] seleciona uma célula e retorna 95.

Um único rótulo passado a loc pesquisa o nível mais externo. Portanto, df.loc[2024] procura uma cidade chamada 2024 e gera KeyError nessa tabela. Para selecionar um ano entre cidades, use df.xs(2024, level="year"). Ele retorna 120 de Osaka e 80 de Lima, com cidade como índice restante.

Para uma seleção mais geral, df.loc[pd.IndexSlice[:, 2025], :] mantém todas as cidades no ano de 2025. Os dois-pontos na primeira posição significam todos os rótulos daquele nível; os dois-pontos finais selecionam todas as colunas.

Ordene antes de fatiar intervalos

A seleção por rótulo exato não exige que todo o índice esteja ordenado, mas fatiar um intervalo de rótulos exige ordenação apropriada. Use df.sort_index() antes de df.loc["Lima":"Osaka"]. Um MultiIndex não ordenado pode gerar UnsortedIndexError para essa fatia.

sort_index() ordena todos os níveis em sua ordem atual, de modo que as cidades vêm primeiro e os anos dentro de cada cidade. sort_index(level="year") ordena pelo nível indicado. swaplevel("city", "year") coloca o ano na posição externa; em seguida, use sort_index() para agrupar e ordenar a nova disposição. Trocar apenas as posições dos níveis não ordena as linhas.

Mova os rótulos de volta para as colunas

reset_index() restaura ambos os níveis como colunas. reset_index(level="year") restaura apenas o ano e mantém a cidade como índice. Essas operações permitem preparar uma tabela para junção ou gravação sem perder seus valores de identificação.

As colunas também podem ter vários níveis. Uma remodelagem com valores de vendas e pessoal pode produzir os rótulos de coluna ("sales", 2024) e ("staff", 2025). df["sales"] seleciona todas as colunas sob o rótulo de nível superior sales.

Para obter um total por cidade, df.groupby(level="city")["sales"].sum() fornece Lima 175 e Osaka 255. Use agrupamento para esse resumo; o antigo argumento sum(level="city") foi removido no pandas 2.0.

Principais conclusões

  • Uma tupla identifica um rótulo completo de MultiIndex entre níveis.
  • A seleção com um único rótulo em loc começa no nível mais externo.
  • Use xs ou IndexSlice para selecionar um nível interno.
  • Ordene o índice antes de fatiar um intervalo de rótulos.
  • Troque níveis de posição para alterar suas funções e redefina-os para restaurar colunas.
  • Use groupby(level=...) para resumos por nível do índice.

5.2 Mova rótulos entre o índice e as colunas

stack e unstack alteram onde os rótulos ficam. Os valores mantêm sua combinação de identificação, mas a tabela pode revelar combinações que não tinham observação.

Empilhe rótulos de colunas no índice

Suponha que um DataFrame largo tenha as cidades Osaka e Lima como índice e os anos 2024 e 2025 como colunas. Osaka tem os valores 120 e 135; Lima tem 80 e 95. Nomeie os eixos city e year para manter seu significado visível.

long = wide.stack() move os rótulos de ano para um novo nível mais interno do índice. Com essas colunas de um único nível, o resultado é uma Series contendo quatro valores:

  • ("Osaka", 2024) fornece 120.
  • ("Osaka", 2025) fornece 135.
  • ("Lima", 2024) fornece 80.
  • ("Lima", 2025) fornece 95.

Os rótulos de cidade se repetem porque cada cidade agora tem uma linha por ano. O empilhamento não somou os valores nem criou medições adicionais.

Desempilhe um nível do índice em colunas

long.unstack() move o nível mais interno do índice, ano, para as colunas e recupera a disposição larga. long.unstack("city") move cidade, produzindo anos como linhas e cidades como colunas. Uma posição numérica de nível, como unstack(0), pode selecionar o mesmo nível, mas um nome torna a intenção mais fácil de ler.

OperaçãoMovimento do rótulo
stack()Um nível de coluna torna-se um nível interno do índice
unstack()Um nível do índice torna-se um nível de coluna

Se a entrada tiver colunas hierárquicas, empilhar um nível pode deixar outro nível como colunas. Para colunas como ("sales", 2024) e ("staff", 2024), stack("year") retorna um DataFrame com colunas de vendas e pessoal. Empilhar todos os níveis de coluna retorna uma Series.

Mantenha combinações ausentes visíveis

Agora suponha que a Series longa não tenha uma entrada para Lima em 2025. O desempilhamento cria uma tabela retangular de cidades por anos, portanto introduz NaN nessa posição. Valores inteiros comuns tornam-se números de ponto flutuante quando essa célula ausente exige um marcador de ausência desse tipo.

unstack(fill_value=0) pode preencher com zero uma combinação recém-ausente. Use-o apenas se ausência significar zero, como nenhuma venda registrada em um conjunto completo de eventos de vendas. Uma observação ausente de sensor é desconhecida e deve permanecer ausente.

stack() do pandas 3 mantém células ausentes. Empilhar a tabela incompleta de 2 por 2 retorna, portanto, quatro entradas, incluindo NaN. Acrescente .dropna() se quiser apenas os três valores conhecidos. Remover lacunas altera quais combinações permanecem representadas, então verifique o comprimento do resultado.

Resolva combinações duplicadas primeiro

O desempilhamento precisa de um único valor para cada combinação completa de índices. Duas entradas com o rótulo ("Lima", 2025) disputam a mesma célula de saída e geram ValueError: Index contains duplicate entries, cannot reshape.

Use long.index.duplicated() para inspecionar rótulos completos repetidos ou verifique as colunas de chave correspondentes antes de definir o índice. Decida se as linhas são cópias acidentais ou observações separadas que devem ser combinadas. Removê-las ou agregá-las é uma decisão sobre os dados; unstack não escolhe uma regra para você.

Principais conclusões

  • stack move rótulos de colunas para dentro; unstack move rótulos de índice para fora.
  • Escolha o nível explicitamente quando o padrão não for o necessário.
  • Combinações ausentes aparecem como células ausentes ao transformar dados para o formato largo.
  • O empilhamento no pandas 3 mantém valores ausentes, a menos que você os remova depois.
  • Cada combinação completa de índices deve ser única para o desempilhamento.

5.3 Alterne entre tabelas longas e largas

No formato longo, colunas de identificação acompanham uma coluna de valor. No formato largo, as medições são distribuídas em colunas, como uma coluna por ano. Escolha o formato que facilite a próxima tarefa: tabelas longas são adequadas para filtragem e agrupamento, enquanto tabelas largas permitem comparações lado a lado.

Transforme pares únicos em células com pivot

Uma tabela longa com as colunas city, year e sales torna-se larga com df.pivot(index="city", columns="year", values="sales"). Rótulos de cidade formam linhas, anos formam colunas e vendas preenchem as células. Isso equivale a df.set_index(["city", "year"])["sales"].unstack().

As vendas de Osaka em 2024 e 2025, de 120 e 135, tornam-se duas células em uma linha. Os valores 80 e 95 de Lima formam a segunda linha. Trocar os argumentos index e columns transpõe essa disposição. Omitir values remodela todas as colunas de dados restantes e pode criar colunas hierárquicas, como um nível de vendas e um de pessoal acima dos anos.

Decida se repetições são erros ou observações

pivot reorganiza valores e não pode combiná-los. Duas linhas de Lima em 2025 exigiriam dois valores em uma célula de saída, portanto geram ValueError. Conte pares repetidos com df.duplicated(subset=["city", "year"]).sum().

Se observações separadas devem ser combinadas, use pivot_table com uma agregação escolhida. Para os valores 95 e 105 em Lima em 2025, sua média padrão fornece 100,0. Com aggfunc="sum", a célula é 200. Se cada par deveria ter aparecido uma vez, mantenha pivot para que ele revele um erro nos dados em vez de resumi-lo sem aviso.

Transforme colunas de medição em linhas com melt

Suponha que um CSV forneça as colunas city, 2023, 2024 e 2025. Os valores de Osaka são 110, 120, 135; os de Lima são 70, 80, 95. Transforme as colunas de ano:

long = wide.melt(
    id_vars="city", var_name="year", value_name="sales"
)

id_vars permanece e se repete. Cada rótulo de coluna de medição torna-se um valor de ano; cada célula torna-se um valor de vendas. Duas linhas e três colunas de medição produzem seis linhas longas, incluindo uma como Osaka, “2023”, 110. Células de medição ausentes também se tornam linhas, a menos que você as remova depois.

Como esses rótulos de coluna vieram de texto CSV, os anos resultantes são texto. Use long["year"] = long["year"].astype(int) antes de fazer operações aritméticas com eles. Rótulos de coluna inteiros na entrada já forneceriam valores inteiros de ano.

Controle o que é transformado e restaure a forma

value_vars=["2024", "2025"] limita a transformação a essas colunas. Esquecer id_vars pode colocar nomes de cidades na mesma coluna de valores que as medições. Sempre distinga identificadores das colunas que contêm valores.

Sem nomes explícitos, a coluna de valores chama-se value. A coluna de variáveis herda wide.columns.name ou se chama variable se esse nome estiver vazio. var_name e value_name explícitos tornam o resultado mais fácil de usar.

Aplique pivot às seis linhas com index="city", columns="year", values="sales" para restaurar as três colunas de ano. Após a operação, cidade é o índice e o eixo das colunas chama-se year. reset_index() restaura cidade como coluna, e rename_axis(columns=None) remove o nome do eixo das colunas. Verifique tanto a forma quanto os rótulos antes de unir ou salvar a tabela.

Principais conclusões

  • O formato longo coloca rótulos de medição em linhas; o formato largo os coloca em colunas.
  • pivot precisa de pares únicos de linha e coluna e não realiza agregação.
  • pivot_table combina pares repetidos usando a agregação escolhida.
  • melt repete identificadores e cria uma linha por célula de medição.
  • Verifique os tipos dos rótulos de coluna quando eles se tornarem valores.
  • Redefina índices e nomes de eixos quando for necessária uma tabela de saída sem índice hierárquico.

Exercícios resolvidos de Tratamento de dados com pandas

5 Lições Interativas

1

Limpe leituras sem perder seu significado

16 passos
Quantifique a ausência de dados, escolha um preenchimento ou remoção adequado e resolva registros repetidos usando uma pequena tabela meteorológica.
  1. 1
    IntroduçãoDecida o que cada lacuna significa

    Uma tabela meteorológica tem quatro cidades e duas colunas de medições: temperatura em °C e chuva em mm. Algumas leituras estão ausentes. Você localizará essas lacunas, decidirá quais linhas podem ser usadas e distinguirá um registro repetido de uma observação realmente diferente. O resultado útil é uma tabela cujos valores restantes ainda significam o que você espera. Use import pandas as pd e import numpy as np para o código.

  2. 2
    ExplicaçãoReconheça o marcador de valor ausente

    Uma lacuna pode aparecer como NaN, NaT ou pd.NA, dependendo de seu tipo de dados. None também é reconhecido como ausente.

    Use df.isna() para criar uma tabela booleana com True em cada lacuna. A comparação com np.nan não identifica esses valores porque NaN é diferente até de si mesmo. O método de detecção permite que a mesma verificação funcione em colunas numéricas, de texto e de data e hora.

  3. 3
    ExemploConte as lacunas meteorológicas

    Lima tem temperatura 18 e chuva 0. Oslo não tem temperatura, mas tem chuva 4. Pune tem temperatura 31 e não tem chuva. Kyiv não tem nenhuma das duas leituras. Todos os nomes de cidades são conhecidos.

    df.isna().sum() fornece cidade 0, temperatura 2 e chuva 2. df.isna().mean() fornece proporções de ausência de 0, 0,5 e 0,5 porque cada coluna tem quatro entradas.

  4. 4
    Ideia-chaveDistinga células de linhas

    Kyiv tem duas células ausentes, enquanto Oslo e Pune têm uma cada. Há quatro células ausentes, mas apenas três linhas afetadas.

    df.isna().sum().sum() conta as células. df.isna().any(axis=1).sum() primeiro marca se cada linha tem alguma lacuna e depois conta essas linhas. O any por linha impede que Kyiv seja contada duas vezes.

  5. 5
    DesafioEncontre um código oculto de valor ausente

    Uma coluna de sensor contém 0, 7, -999 e NaN. Sua documentação diz que -999 significa que o sensor estava desligado. Quantos valores devem permanecer conhecidos após a limpeza?

    ---reveal---

    Dois: 0 e 7. Substitua o código documentado -999 por um marcador de valor ausente e depois use isna() novamente. Zero é uma leitura real aqui. Tratar todo zero como ausente removeria um valor conhecido junto com as leituras indisponíveis.

  6. 6
    ExemploMantenha linhas que têm temperatura

    Suponha que a análise precise de temperatura, mas possa tolerar chuva desconhecida. Use clean = df.dropna(subset=["temp_c"]). Isso mantém Lima e Pune.

    O dropna() padrão manteria apenas Lima porque verifica todas as colunas. thresh=2 também manteria Oslo, cuja cidade e chuva são conhecidas. Escolha a regra que expressa as colunas de que a análise realmente precisa.

  7. 7
    ExemploMarque estimativas antes de preencher

    Para uma análise de chuva que mantém todas as cidades, comece pelas quatro linhas originais. Antes de preencher temperaturas, salve df["temp_missing"] = df["temp_c"].isna().

    As temperaturas conhecidas 18 e 31 têm média 24,5. Atribua df["temp_c"] = df["temp_c"].fillna(df["temp_c"].mean()) para preencher as duas lacunas. O indicador salvo ainda identifica as leituras de Oslo e Kyiv como estimadas.

  8. 8
    DicaEscolha a estimativa pelo seu significado

    O preenchimento pela média usa as leituras conhecidas como uma estimativa simples, mas reduz a variação aparente. A mediana é menos sensível a leituras extremas. Preencher com zero afirma algo diferente: a quantidade ausente era zero.

    Um sensor de chuva desligado não comprova que a chuva foi zero. Use preenchimentos por coluna compatíveis com seus tipos de dados, como um dicionário com valores numéricos para campos numéricos e texto para campos de texto.

  9. 9
    ConexãoUse a ordem apenas quando ela trouxer informação

    O preenchimento para a frente leva o valor conhecido anterior a uma lacuna; o preenchimento para trás usa o próximo. Com 12, NaN, NaN, 15, ffill(limit=1) fornece 12, 12, NaN, 15.

    A interpolação, por sua vez, estima entre posições conhecidas: 10, NaN, NaN, 16 torna-se 10, 12, 14, 16. Esses métodos são adequados para leituras com uma ordem significativa, não para uma lista de cidades sem relação.

  10. 10
    DesafioMantenha linhas utilizáveis sem afirmar que não choveu

    Três registros contêm A/19/2, B/21/NaN e C/NaN/5 para cidade/temperatura/chuva. Você precisa comparar temperaturas e não pode estimar a chuva ausente. Quais linhas e valores deve manter?

    ---reveal---

    Mantenha A e B verificando a coluna de temperatura com dropna(subset=["temp_c"]). Deixe a chuva de B ausente. Remover linhas com base em todas as colunas faria perder a temperatura utilizável de B; preencher sua chuva com zero acrescentaria uma medição sem fundamento.

  11. 11
    ExemploCompare registros completos

    Uma tabela de pedidos tem os identificadores 101, 102, 102, 103, 104, 104. As duas linhas de 102 são idênticas. As duas linhas de 104 diferem no peso registrado: 0,5 kg e 0,8 kg.

    df.duplicated().sum() informa uma cópia extra de linha completa. drop_duplicates() deixa cinco linhas porque os registros diferentes de 104 não são cópias exatas. Os rótulos de índice não afetam essa comparação.

  12. 12
    ExplicaçãoEscolha uma chave e uma versão a manter

    Comparar apenas order_id marca o segundo 102 e o segundo 104 como repetições, fornecendo duas cópias extras de chave. A questão agora é qual versão representa cada pedido.

    keep="last" escolhe a última na ordem atual das linhas. Para que isso signifique a mais recente, ordene primeiro por um campo de atualização. keep=False remove todos os membros de grupos repetidos, então descartaria ambos os registros de 104.

  13. 13
    DesafioMantenha o registro mais recente

    O item H tem atualizações 1, 4, 2 e pesos 3, 6, 5 kg nessa ordem de entrada. Como você mantém seu registro mais recente e qual peso permanece?

    ---reveal---

    Ordene updated em ordem crescente e depois use drop_duplicates(subset="item", keep="last"). A atualização mais recente é 4, então 6 kg permanece. Manter a última linha de entrada sem ordenar selecionaria a atualização 2 e manteria incorretamente 5 kg.

  14. 14
    DicaPadronize antes de verificar a identidade

    As chaves de texto “ Lisbon”, “lisbon” e “LISBON ” não correspondem exatamente. Remova os espaços das extremidades e coloque-as em minúsculas quando essas grafias identificarem a mesma cidade. Depois, inspecione as chaves repetidas.

    A finalidade da tabela decide se a repetição é válida: muitos pedidos podem compartilhar um cliente, mas uma tabela de consulta destinada a fornecer uma linha de informações por cliente precisa de chaves únicas. Remover pedidos válidos não corrige uma chave de consulta repetida.

  15. 15
    DesafioRelacione a limpeza de texto à escolha de registros

    Registros de clientes têm as chaves “ emi ” e “EMI”, atualizações 2 e 5 e saldos 10 e 14. O saldo mais antigo está ausente em um terceiro registro sem relação com esses. Você precisa do registro mais recente por cliente. O que deve acontecer antes de preencher qualquer saldo?

    ---reveal---

    Padronize as chaves, ordene por atualização e mantenha a última linha por chave limpa. As duas grafias de Emi tornam-se um cliente com saldo 14. Resolva primeiro a identidade dos registros para que versões obsoletas não influenciem uma estatística de preenchimento posterior.

  16. 16
    RecapitulaçãoVerifique o resultado em relação à decisão

    Após a limpeza, compare a contagem de linhas, as contagens de valores ausentes e a unicidade das chaves com o resultado pretendido. Um indicador de valores ausentes mantém as estimativas visíveis; uma verificação de duplicatas por chave ordenada mantém visível a versão escolhida do registro.

    Salve objetos retornados por atribuição direta. Sob a cópia na escrita do pandas 3, uma chamada encadeada com inplace em uma coluna selecionada não atualiza seu DataFrame original.

2

Transforme códigos e medições

15 passos
Escolha substituições exatas, consultas, conversão, intervalos, valores escalonados e indicadores conforme a saída necessária.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoEscolha o significado da saída
  2. 2
    ExemploTransforme ou edite um valor
  3. 3
    ExemploConverta o texto após limpar seu formato
  4. 4
    Ideia-chaveMantenha cabeçalhos separados das células
  5. 5
    DesafioLocalize a origem de uma nova lacuna
  6. 6
    ExemploInterprete os extremos de um intervalo
  7. 7
    ExplicaçãoInclua o menor limite de forma consciente
  8. 8
    ConexãoEscolha amplitudes ou contagens
  9. 9
    DesafioTeste a regra dos limites
  10. 10
    ExemploSubtraia o mínimo antes de dividir
  11. 11
    ExemploMeça a distância da média
  12. 12
    DicaLimite sem excluir uma observação
  13. 13
    ExplicaçãoRepresente a participação em categorias
  14. 14
    DesafioExplique uma linha de indicadores todos falsos
  15. 15
    RecapitulaçãoVerifique a representação criada
3

Transforme texto inconsistente em rótulos úteis

17 passos
Limpe nomes, extraia quantidades de descrições e preserve o significado dos rótulos e da ordem das categorias.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoDê ao texto uma estrutura consistente
  2. 2
    ExplicaçãoAplique um método a cada string
  3. 3
    ExemploDivida apenas onde o formato exigir
  4. 4
    DicaMantenha literal uma pesquisa de texto simples
  5. 5
    DesafioPrepare uma chave de texto para junção
  6. 6
    ExplicaçãoConstrua um padrão de quantidade
  7. 7
    ExemploExtraia a primeira quantidade
  8. 8
    ConexãoEscolha todas as correspondências quando uma for insuficiente
  9. 9
    DesafioRejeite uma correspondência parcial de código
  10. 10
    DicaLimite o que um padrão consome
  11. 11
    ExemploSepare a lista de rótulos de seus códigos
  12. 12
    ExplicaçãoDê aos tamanhos a ordem pretendida
  13. 13
    DicaAbra espaço antes de atribuir um novo rótulo
  14. 14
    DesafioMantenha categorias vazias visíveis
  15. 15
    ConexãoCombine categorias entre lotes
  16. 16
    DesafioLimpe antes de definir a lista permitida
  17. 17
    RecapitulaçãoInspecione os valores de texto e o armazenamento
4

Combine tabelas e confira cada linha

18 passos
Preveja correspondências de chaves, inspecione registros sem correspondência, preencha valores por rótulo e escolha quando concatenar observações.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoEscolha como as tabelas se relacionam
  2. 2
    ExemploIndique explicitamente a chave compartilhada
  3. 3
    ExplicaçãoPreserve o lado necessário
  4. 4
    Ideia-chaveEspere todos os pares correspondentes
  5. 5
    DicaTransforme a relação em uma regra verificada
  6. 6
    ExemploConte chaves sem correspondência separadamente
  7. 7
    DesafioEncontre a causa das linhas extras
  8. 8
    ExemploAssocie uma coluna esquerda a um índice direito
  9. 9
    DicaDistinga colunas com nomes compartilhados
  10. 10
    ExemploDê prioridade à fonte principal
  11. 11
    ConexãoSiga os rótulos ao somar valores
  12. 12
    DesafioPreencha a observação correta
  13. 13
    ExemploAdicione observações associando nomes de colunas
  14. 14
    ExplicaçãoMantenha um rótulo de origem ou crie um novo índice
  15. 15
    Ideia-chaveAlinhe linhas ao adicionar colunas
  16. 16
    DesafioDiagnostique novas lacunas de distância
  17. 17
    DesafioCombine lotes antes de adicionar informações de consulta
  18. 18
    RecapitulaçãoConfira adições e correspondências
5

Remodele valores mantendo seus rótulos

18 passos
Construa um MultiIndex, mova níveis com stack e unstack e escolha pivot ou melt para os formatos longo e largo.

Salve esta aula para seguir cada Lição Interativa passo a passo.

  1. 1
    IntroduçãoAcompanhe a identidade de cada medição
  2. 2
    ExemploDê dois rótulos a uma linha
  3. 3
    ExplicaçãoSelecione o nível que você realmente pretende
  4. 4
    DicaOrdene após alterar as funções dos níveis
  5. 5
    DesafioSelecione um nível interno sem alterar os dados
  6. 6
    ExemploMova colunas de ano para o índice
  7. 7
    ExplicaçãoEscolha o nível que se torna colunas
  8. 8
    Ideia-chaveReconheça uma lacuna que se tornou visível
  9. 9
    DesafioDescubra por que a transformação para o formato largo falha
  10. 10
    ConexãoEscolha o formato longo ou largo para a próxima tarefa
  11. 11
    ExemploTransforme um par único em uma célula com pivot
  12. 12
    ExplicaçãoAgregue apenas quando essa for a intenção
  13. 13
    ExemploTransforme medições com melt mantendo identificadores
  14. 14
    DicaVerifique em que tipo um rótulo de coluna se transforma
  15. 15
    DesafioReconstrua uma célula ausente no formato largo
  16. 16
    ConexãoRestaure uma tabela pronta para operações com colunas
  17. 17
    DesafioEscolha a correção para medições repetidas
  18. 18
    RecapitulaçãoVerifique forma, unicidade e significado

Questões de Tratamento de dados com pandas

50 Questões de Prática em 5 conjuntos

Conjunto 1: Leia os dados e preveja alterações simples10 Questões de Prática

Questão 1 de 10

Uma Series de ponto flutuante contém 6, NaN e 12. Qual é sua média padrão?
  1. 6,0
  2. 18,0
  3. 12,0
  4. 9,0
Mostrar respostaOcultar resposta
Resposta: D
A média usa os dois valores conhecidos, então soma 6 e 12 e divide por 2 para obter 9,0. Dividir pelas três posições fornece 6,0, o que trata a entrada ausente como zero, embora nenhum zero tenha sido observado. len conta posições; a média padrão ignora lacunas.

Questão 2 de 10

Um DataFrame tem células ausentes na linha A/coluna x, linha A/coluna y e linha C/coluna x. Todas as outras células são conhecidas. Quantas linhas df.isna().any(axis=1).sum() conta?
  1. 3
  2. 4
  3. 1
  4. 2
Mostrar respostaOcultar resposta
Resposta: D
As linhas A e C contêm pelo menos uma lacuna cada, então duas linhas são contadas. A linha A contribui apenas uma vez para esse teste por linha, apesar de ter duas células ausentes. Um total de três contaria células ausentes em vez das linhas afetadas por elas.

Questão 3 de 10

Uma tabela tem as colunas item, mass_kg e note. A linha U tem massa conhecida e nota ausente; a linha V tem massa ausente e nota conhecida. Ambos os nomes de itens são conhecidos. O que df.dropna(subset=["mass_kg"]) mantém?
  1. Nenhuma das linhas
  2. Apenas a linha V
  3. Apenas a linha U
  4. Ambas as linhas
Mostrar respostaOcultar resposta
Resposta: C
Apenas a linha V tem uma lacuna na coluna verificada, então ela é removida e U permanece. Uma nota ausente não importa para essa regra de subconjunto. Remover ambas as linhas aplicaria a verificação padrão mais ampla em todas as colunas, em vez da verificação especificada apenas para massa.

Questão 4 de 10

Uma Series contém “A”, “B” e “C”. O que s.map({"A": "active", "B": "blocked"}) produz?
  1. “active”, “blocked”, “blocked”
  2. “active”, “blocked”, NaN
  3. “active”, “blocked”, “C”
  4. “A”, “B”, NaN
Mostrar respostaOcultar resposta
Resposta: B
As duas chaves do dicionário são transformadas nas saídas indicadas, e C torna-se ausente porque a consulta não tem uma entrada C. Manter o C original é o comportamento de replace com esse dicionário. Um dicionário passado a map define saídas para todo o mapeamento, não apenas edições de valores selecionados.

Questão 5 de 10

Os valores 0, 10 e 20 são passados a pd.cut(x, [0, 10, 20]) com os padrões. Para onde vai 10?
  1. Ele vai para (0, 10].
  2. Ele pertence aos dois intervalos.
  3. Ele vai para (10, 20].
  4. Ele se torna ausente.
Mostrar respostaOcultar resposta
Resposta: A
Os intervalos padrão incluem seu extremo direito e excluem seu extremo esquerdo. Portanto, dez pertence ao primeiro intervalo, cujo limite direito é 10. Colocá-lo no segundo intervalo usaria intervalos fechados à esquerda, o que exige right=False.

Questão 6 de 10

Uma Series de cidades contém “ Accra”, “ACCRA ” e “accra”. Após s.str.strip().str.lower(), quantos valores distintos e linhas permanecem?
  1. 1 valor distinto, 3 linhas.
  2. 3 valores distintos, 3 linhas.
  3. 1 valor distinto, 1 linha.
  4. 2 valores distintos, 3 linhas.
Mostrar respostaOcultar resposta
Resposta: A
Remover espaços das extremidades e colocar em minúsculas transforma todas as entradas em “accra”, então há um valor distinto nas três linhas originais. A limpeza de strings altera valores sem remover registros. Um resultado de uma linha exigiria uma operação adicional de remoção de duplicatas, que não foi realizada.

Questão 7 de 10

Um código de produto é “72x”. Como str.contains(r"\d+") e str.fullmatch(r"\d+") o classificam?
  1. Contains é verdadeiro; fullmatch é falso.
  2. Ambos retornam verdadeiro.
  3. Contains é falso; fullmatch é verdadeiro.
  4. Ambos retornam falso.
Mostrar respostaOcultar resposta
Resposta: A
O código contém uma sequência de dígitos, então a pesquisa em qualquer posição encontra correspondência. O x final impede que o código inteiro corresponda a um padrão apenas de dígitos, então fullmatch falha. Tratar o prefixo numérico como correspondência integral aceitaria texto fora do formato exigido.

Questão 8 de 10

Entregas têm as chaves de depósito P, P, Q, R. Uma tabela de depósitos tem as chaves P, P, Q, S. Quantas linhas resultam de uma junção externa completa pela chave?
  1. 8
  2. 7
  3. 6
  4. 9
Mostrar respostaOcultar resposta
Resposta: B
As duas linhas P de cada lado produzem quatro pares, e Q contribui com uma linha correspondente. R e S adicionam uma linha sem correspondência cada, totalizando sete. Seis deixaria de contar um dos lados sem correspondência ou contaria menos pares de chaves repetidas; uma junção externa completa mantém as chaves sem correspondência dos dois lados.

Questão 9 de 10

O lote A, com duas linhas, tem as colunas id, km. O lote B, com três linhas, tem as colunas id, km, flag. Qual forma resulta de pd.concat([a, b], ignore_index=True)?
  1. 6 linhas, 3 colunas
  2. 3 linhas, 3 colunas
  3. 5 linhas, 3 colunas
  4. 5 linhas, 2 colunas
Mostrar respostaOcultar resposta
Resposta: C
A concatenação de linhas soma os comprimentos das entradas, fornecendo cinco linhas, e mantém a união dos nomes de colunas, fornecendo três colunas. As duas linhas de A recebem valores ausentes em flag. Duas colunas exigiriam join="inner"; redefinir o índice não descarta uma coluna extra.

Questão 10 de 10

Uma tabela larga tem 3 linhas de estações e as colunas station, dry e wet. Qual comprimento resulta de transformar as duas colunas de medição com melt e id_vars="station"?
  1. 9 linhas
  2. 6 linhas
  3. 3 linhas
  4. 2 linhas
Mostrar respostaOcultar resposta
Resposta: B
Cada uma das três linhas de estação contribui com uma medição dry e uma wet, produzindo seis linhas longas. O identificador da estação é repetido, não transformado em medição. Nove trataria incorretamente o identificador como uma terceira coluna de medição; apenas as duas colunas de valores selecionadas contribuem para o multiplicador de linhas.
Conjunto 2: Escolha métodos para tarefas comuns de tratamento de dados10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Os identificadores na ordem das linhas são K, L, L, M, M, N. Quais permanecem após drop_duplicates(subset="id", keep=False)?
  1. K, N
  2. L, M
  3. K, L, N
  4. K, L, M, N
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma Series ordenada é 5,0, NaN, NaN, 11,0. O que ffill(limit=1) produz?
  1. 5, NaN, 11, 11
  2. 5, 8, NaN, 11
  3. 5, 5, NaN, 11
  4. 5, 5, 5, 11
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma Series contém “900”, “1,600” e “bad”. Após a remoção literal das vírgulas e pd.to_numeric(..., errors="coerce"), quais valores permanecem?
  1. 900, 1600, 0
  2. “900”, “1600”, “bad”
  3. 900, NaN, NaN
  4. 900, 1600, NaN
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma Series não constante contém 5, 15 e 25. Qual é o valor de 15 após o escalonamento mínimo-máximo?
  1. 0,0
  2. 0,6
  3. 0,5
  4. 0,4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma coluna categórica permite “low” e “high”. O que deve acontecer antes que “medium” possa ser atribuído a uma linha?
  1. Ordenar seus códigos de categoria existentes.
  2. Remover suas categorias existentes não utilizadas.
  3. Adicionar “medium” às suas categorias.
  4. Definir sua ordem atual como verdadeira.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma Series contém “Park Rd”, “Rd” e “Road”. Qual é o resultado de s.replace("Rd", "Road")?
  1. “Park Rd”, “Road”, “Road”
  2. “Park Rd”, “Rd”, “Road”
  3. “Park Road”, “Road”, “Road”
  4. “Park Road”, “Rd”, “Road”
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Uma tabela de sensores tem as chaves S, S, T e deve manter todas as observações. Sua tabela de consulta tem uma linha para S e uma para T. Quais configurações de junção expressam esse requisito?
  1. how="left", validate="one_to_many"
  2. how="outer", validate="one_to_one"
  3. how="inner", validate="one_to_one"
  4. how="left", validate="many_to_one"
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

A Series a tem p = 4, q = NaN; a Series b tem q = 9, r = 2. Qual é o resultado de a.combine_first(b)?
  1. p = 4, q = 9
  2. p = 4, q = 9, r = 2
  3. p = 4, q = NaN
  4. p = NaN, q = 9, r = 2
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Uma tabela indexada por local/mês tem as leituras 2 e 5 para C/6, a leitura 4 para D/6 e a leitura 9 para C/7. Um analista troca os níveis e depois tenta .loc["C"] para obter totais por local para o mês 6. Qual correção preserva as leituras e fornece os totais necessários?
  1. Agrupar todas as linhas por local antes de selecionar o relatório: C = 16, D = 4.
  2. Usar xs("C", level="site") e depois agrupar por mês: 6 = 7, 7 = 9.
  3. Remover pares repetidos de local/mês e depois selecionar o mês 6: C = 2, D = 4.
  4. Usar xs(6, level="month") e depois agrupar por local: C = 7, D = 4.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma Series longa tem as leituras de local/período A/1 = 2, A/1 = 4, A/2 = 5, B/1 = 3. Deve-se calcular a média das duas leituras A/1; uma combinação ausente é desconhecida. Você precisa de todas as combinações de local/período em um relatório largo e depois em uma exportação longa. Qual plano é adequado?
  1. Calcular a média de A/1, aplicar unstack, depois stack e remover lacunas: 3 entradas conhecidas.
  2. Calcular a média de A/1, aplicar unstack e depois stack: 4 entradas, uma ausente.
  3. Manter o primeiro A/1, aplicar unstack e depois stack: 4 entradas, uma ausente.
  4. Calcular a média de A/1, aplicar unstack com preenchimento zero e depois stack: 4 entradas conhecidas.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 3: Acompanhe rótulos, chaves e mudanças de forma10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Uma Series tem os valores "", " " e None, criados diretamente na memória. Quantos valores s.isna().sum() conta?
  1. 3
  2. 1
  3. 2
  4. 0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

As linhas do item Z têm valores de atualização 2, 5 e 3, com massas de 8, 11 e 9 kg, respectivamente. Qual massa permanece após ordenar as atualizações em ordem crescente e manter a última chave duplicada do item?
  1. 8 kg
  2. 28 kg
  3. 11 kg
  4. 9 kg
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma Series contém oito leituras distintas de 1 a 8. Quantas leituras entram em cada um dos quatro grupos de qcut?
  1. 1
  2. 8
  3. 2
  4. 4
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

As descrições são “Oats 18kg, 4kg” e “Tea”. O que s.str.extract(r"(\d+)\s*kg", expand=False) seguido de conversão numérica retorna?
  1. 18 e NaN
  2. 18 e 0
  3. 22 e NaN
  4. 4 e NaN
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Uma coluna de texto tem os valores “small”, “large”, “medium”. No pandas 3.1, ela é convertida para um tipo categórico fixo com as categorias ["small", "large"] e depois contada com dropna=False. Quais contagens aparecem?
  1. small 1, large 2, ausente 0
  2. small 1, large 1, ausente 1
  3. small 1, large 1, ausente 0
  4. small 1, large 1, medium 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Uma junção externa completa une as chaves esquerdas A, A, B, D às chaves direitas A, A, A, C. Quais são as contagens de linhas _merge para both, left_only e right_only?
  1. 6, 2, 1
  2. 6, 1, 1
  3. 3, 2, 1
  4. 2, 2, 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

A Series x tem a = 2, b = 6, e y tem b = 4, c = 8. Após x.add(y, fill_value=0), qual é a soma dos valores resultantes?
  1. 24
  2. 12
  3. 20
  4. 10
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Um índice tem os níveis externo de cidade e interno de ano. Após swaplevel("city", "year").sort_index(), o que .loc[2027] seleciona?
  1. Linhas de 2027 em diante.
  2. A linha na posição 2027.
  3. A cidade com o rótulo 2027.
  4. Todas as linhas do ano 2027.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

As contagens de eventos são N/1 = 7, N/2 = 9, S/1 = 3, sem registro de S/2. O registro de eventos está completo, então a ausência significa que não houve eventos. Um relatório deve mostrar cada par de local/período e manter essa cobertura em uma exportação longa. Qual plano e resultado são adequados?
  1. Aplicar unstack, stack e preenchimento para a frente: 4 entradas totalizando 22.
  2. Aplicar unstack, stack e remover lacunas: 3 entradas totalizando 19.
  3. Aplicar unstack com preenchimento zero e depois stack: 3 entradas totalizando 19.
  4. Aplicar unstack com preenchimento zero e depois stack: 4 entradas totalizando 19.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma tabela longa tem os valores 8 e 12 para P/2026 e o valor 6 para Q/2026. Qual é o resultado de uma pivot_table usando local como linhas, ano como colunas e agregação padrão, seguida de melt na única coluna de ano?
  1. 2 linhas com valores 10, 6
  2. 3 linhas com valores 10, 10, 6
  3. 3 linhas com valores 8, 12, 6
  4. 2 linhas com valores 20, 6
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 4: Diagnostique alterações em um fluxo de limpeza10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

As leituras em uma coluna numérica são 2, 4, 30, NaN. Você salva um indicador de valores ausentes e depois preenche a lacuna com a mediana da coluna. Qual valor é preenchido e quantos valores do indicador são verdadeiros?
  1. 3 e 1
  2. 4 e 0
  3. 12 e 1
  4. 4 e 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

Uma tabela contém as chaves “ seoul”, “SEOUL” e “busan”. Os demais dados correspondem dentro de cada cidade. Após remover espaços das extremidades e colocar a chave em minúsculas, quantas linhas permanecem quando todos os membros de grupos de chaves repetidas são removidos?
  1. 3
  2. 1
  3. 2
  4. 0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

O texto numérico original é “5”, “none”, None, “ 9 ”. Após to_numeric(errors="coerce"), quantos valores originalmente presentes se tornaram ausentes?
  1. 3
  2. 0
  3. 2
  4. 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

Uma coluna de massa contém 0, 10, 20 e uma leitura desconhecida. Após cut com os limites [0, 10, 20] e indicadores padrão, duas linhas têm todos os indicadores falsos. Você precisa categorizar massas válidas e identificar separadamente leituras desconhecidas. Qual correção é adequada?
  1. Remover linhas com todos os indicadores falsos e manter os limites originais.
  2. Mudar para right=False e deixar desativados os indicadores de ausência.
  3. Incluir o menor limite e usar dummy_na=True na codificação.
  4. Preencher a massa desconhecida com 0 e aplicar cut com include_lowest=True.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

O que s.str.split("/", n=1, expand=True) faz com “zone/aisle/bin”?
  1. Cria 3 colunas: “zone”, “aisle”, “bin”.
  2. Cria 1 coluna contendo o texto original.
  3. Cria 2 colunas: “zone”, “aisle/bin”.
  4. Cria 2 colunas: “zone/aisle”, “bin”.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Os códigos são “T.8”, “T18” e “T.12”. Você deve selecionar códigos que contenham um ponto literal, depois extrair seus dígitos finais com r"(\d+)" e convertê-los. Quais valores numéricos permanecem?
  1. 8 e 12
  2. 8, 18, 12
  3. Apenas 18
  4. 8 e 1
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Remessas têm as chaves de fornecedores “ ax ”, “AX”, “by”. Uma tabela de consulta tem “ax”, “ax”, “by”, com informações diferentes em suas duas linhas ax. O que deve ser resolvido antes que uma junção à esquerda possa fornecer com segurança uma linha de informações por remessa?
  1. Manter apenas a primeira remessa de cada chave.
  2. Padronizar apenas o texto das chaves das remessas.
  3. Renomear apenas as colunas de informações compartilhadas.
  4. Padronizar chaves e resolver chaves duplicadas na consulta.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

A tabela a tem duas linhas com as colunas id, km. A tabela b tem uma linha com as colunas id, Km. Após a concatenação de linhas com o tratamento padrão de colunas, quantas células estão ausentes nas duas colunas de distância juntas?
  1. 3
  2. 2
  3. 1
  4. 0
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Um MultiIndex de região/ano contém E/2025 = 3, E/2026 = 5, W/2025 = 7, W/2026 = 11. Um relatório precisa apenas de 2026, com regiões como colunas. Um analista seleciona .loc[2026] e depois aplica pivot. Qual correção seleciona os dados e produz uma única linha de relatório?
  1. Selecionar xs(2025, level="year"), restaurar o ano como 2026 e aplicar pivot por ano/região: 3 e 7.
  2. Selecionar xs(2026, level="year"), restaurar o ano como 2026 e aplicar pivot por ano/região: 5 e 11.
  3. Selecionar xs(2026, level="year"), restaurar o ano como 2026 e aplicar pivot por ano/região: 8 e 18.
  4. Somar por região, restaurar o ano como 2026 e aplicar pivot por ano/região: 8 e 18.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

Uma tabela tem três locais únicos, com as colunas site, day e night. Uma célula de night está ausente. Após aplicar melt às duas medições, remover valores ausentes e aplicar pivot de volta, quais são a contagem de linhas longas e a contagem de células ausentes na tabela larga?
  1. 5 linhas e 0 lacunas
  2. 5 linhas e 1 lacuna
  3. 6 linhas e 0 lacunas
  4. 6 linhas e 1 lacuna
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Conjunto 5: Raciocine sobre transformações encadeadas10 Questões de Prática

Salve esta aula para ver todas as respostas e praticar cada conjunto.

Questão 1 de 10

Uma coluna numérica na memória contém 0, -99, NaN e 6. Sua documentação define -99 como ausente e 0 como uma leitura real. Após a limpeza, quais são a contagem de valores conhecidos e a média?
  1. 2 conhecidos, média 3
  2. 3 conhecidos, média 2
  3. 3 conhecidos, média -31
  4. 2 conhecidos, média 6
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 2 de 10

As linhas são A/2/desconhecido, B/desconhecido/8, C/desconhecido/desconhecido, D/6/10 para local/x/y. Mantenha toda linha com pelo menos uma medição conhecida e depois preencha apenas x com a média dos valores que permanecerem. Qual regra de linhas e soma final de x são adequadas?
  1. Manter pelo menos 2 células conhecidas por linha; soma de x igual a 8.
  2. Remover toda linha com uma medição ausente; soma de x igual a 6.
  3. Manter pelo menos 2 células conhecidas por linha; soma de x igual a 12.
  4. Manter pelo menos 1 célula conhecida por linha; soma de x igual a 16.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 3 de 10

Uma Series contém os códigos “a”, “b” e “z”. O fluxo mapeia {"a": "4", "b": "bad"} e depois aplica coerção numérica. Quais entradas originais terminam ausentes e por quê?
  1. Apenas b, porque bad não é numérico.
  2. b e z, por falha de conversão e de consulta.
  3. Apenas z, porque sua chave está ausente.
  4. a e b, pelo mapeamento de texto parecido com número.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 4 de 10

As medições originais são 3, 9, 21, 45. Uma coluna transformada é 0, aproximadamente 0,333, 1, 1 na mesma ordem. Qual sequência de operações explica a saída mantendo todas as linhas?
  1. Limitar a 21 e depois aplicar escalonamento mínimo-máximo à coluna limitada.
  2. Dividir por 45 e depois limitar os valores escalonados a 1.
  3. Limitar a 21 e depois dividir a coluna limitada por 21.
  4. Aplicar escalonamento mínimo-máximo à coluna original e depois limitar a 1.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 5 de 10

Dados categóricos não ordenados contêm rótulos de países e têm códigos inteiros. Um modelo interpreta entradas numéricas como quantidades. Por que esses códigos devem ser substituídos por indicadores de categoria?
  1. Os códigos não podem ser armazenados em colunas numéricas.
  2. Os indicadores criam uma classificação correta dos países.
  3. Os códigos imporiam uma ordem e distâncias inventadas.
  4. Os códigos usam mais memória que todos os valores de texto.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 6 de 10

Remessas têm as chaves U, U, V, W. Uma tabela de consulta de fornecedores tem U/atualização 1, U/atualização 4, V/atualização 2, X/atualização 2. Você precisa das informações mais recentes por fornecedor, de todas as remessas mantidas e da contagem de chaves distintas sem correspondência entre as duas fontes. Qual plano é adequado?
  1. Manter as chaves de consulta mais recentes; verificar com junção externa completa; junção interna tem 3 linhas e 2 chaves sem correspondência.
  2. Manter as chaves de consulta mais recentes; verificar com junção interna; junção à esquerda tem 4 linhas e 0 chaves sem correspondência.
  3. Manter uma remessa por chave; verificar com junção externa completa; junção à esquerda tem 3 linhas e 2 chaves sem correspondência.
  4. Manter as chaves de consulta mais recentes; verificar com junção externa completa; junção à esquerda tem 4 linhas e 2 chaves sem correspondência.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 7 de 10

Os valores principais são a = 5, b = NaN; os valores de reserva são a = 50, b = 7, c = 9. Após primary.combine_first(backup), o que mudaria ao inverter a prioridade das fontes?
  1. Apenas c desaparece do resultado.
  2. Apenas a muda de 5 para 50.
  3. Todos os valores do resultado mudam.
  4. Apenas b muda de 7 para ausente.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 8 de 10

Dois DataFrames têm, cada um, as colunas kg e count, ambas usando "Int64" com suporte a valores ausentes. Um terceiro tem apenas kg com esse tipo. Após a concatenação de linhas, o que melhor explica a coluna count resultante?
  1. Ela perde todas as linhas da terceira entrada.
  2. Ela continua inteira com suporte a ausentes, com lacunas para a terceira entrada.
  3. Ela é texto porque uma entrada omitiu count.
  4. Ela torna-se inteira comum com zeros para a terceira entrada.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 9 de 10

Os registros de eventos são A/1 = 4, A/1 = 6, A/2 = 8, B/1 = 3. O registro está completo, e um relatório deve mostrar o total de cada local/período, incluindo pares sem eventos, e depois exportar a mesma cobertura como linhas longas. Qual plano fornece a exportação exigida?
  1. Somar pares repetidos, aplicar unstack com preenchimento zero e depois stack: 4 linhas, soma 21.
  2. Manter o primeiro par repetido, aplicar unstack com preenchimento zero e depois stack: 4 linhas, soma 15.
  3. Calcular a média dos pares repetidos, aplicar unstack com preenchimento zero e depois stack: 4 linhas, soma 16.
  4. Somar pares repetidos, aplicar unstack, depois stack e remover lacunas: 3 linhas, soma 21.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Questão 10 de 10

As contagens conhecidas de eventos são A/1 = 4, A/1 = 8, A/2 = 6, B/1 = 5; B/2 não tem registro e é desconhecido. Um analista usa uma tabela dinâmica padrão e depois aplica melt, afirmando exportar totais para pares conhecidos. Qual saída revisada e raciocínio são adequados?
  1. Quatro linhas totalizando 23, porque melt recupera ambos os registros A/1.
  2. Quatro linhas totalizando 23, porque zero pode substituir o par desconhecido.
  3. Três linhas totalizando 17, porque a média padrão é um total do par.
  4. Três linhas totalizando 23, após agregar por soma e remover células desconhecidas.
Mostrar respostaOcultar resposta

Salve esta aula para ver esta resposta.

Travou em uma questão sua? Ajuda com Tarefas

Termos-Chave

72 Termos-Chave, cada um com sua definição

A

Acessor de texto str
O acessor de texto str disponibiliza métodos vetorizados de texto em uma Series, permitindo limpar ou pesquisar cada string não ausente.
Use o acessor str em s.str.lower() para colocar uma coluna inteira de cidades em minúsculas em uma expressão.
Alinhamento por rótulos
O alinhamento por rótulos associa valores do pandas por seus rótulos de linha ou coluna, de modo que objetos em ordens diferentes ainda possam corresponder às mesmas observações.
Ao somar duas Series, o alinhamento por rótulos soma os valores identificados por b mesmo quando b ocupa uma posição diferente em cada Series.
Argumento id_vars
O argumento id_vars identifica colunas a preservar durante a transformação com melt, separando identificadores de observações de colunas que contêm medições.
Definir id_vars="station" mantém nomes de estações fora das leituras numéricas criadas por um melt.
Argumento subset
O argumento subset limita uma verificação de duplicatas ou dados ausentes às colunas indicadas, deixando outras colunas fora dessa decisão.
Use subset="order_id" para detectar chaves de pedido repetidas mesmo quando seus pesos registrados diferem.

C

Caracteres em branco
Caracteres em branco são caracteres de espaçamento, como espaços e tabulações, que podem ter significado dentro de um texto ou ser indesejados ao redor de um rótulo.
Caracteres em branco nas extremidades fazem “Lima ” ser diferente de “Lima” até que os valores de cidade sejam limpos com str.strip().
Categoria não utilizada
Uma categoria não utilizada é um rótulo categórico permitido sem observações no momento, que permanece nas contagens até ser removido da lista.
Uma categoria não utilizada L aparece com contagem 0 quando uma coluna de tamanho contém atualmente apenas S e M.
Chave de origem
Uma chave de origem fornecida a concat torna-se um rótulo externo de índice que identifica a parte da qual cada linha ou coluna se originou.
Uma chave de origem chamada “batch_a” permite recuperar essas linhas mesmo quando números de linha internos se repetem entre lotes.
Chave do registro
Uma chave do registro é uma coluna ou combinação de colunas que identifica um registro real, definindo quais repetições precisam de investigação.
Um identificador de pedido é uma chave do registro, enquanto um identificador de cliente pode ocorrer legitimamente em vários pedidos separados.
Classe de caracteres
Uma classe de caracteres descreve um caractere permitido, usando uma abreviação como \d ou um intervalo como [A-Z] em um padrão.
A classe de caracteres [A-Z] corresponde a uma letra maiúscula em um código de estoque antes de seus dígitos.
Código de categoria
Um código de categoria é um identificador inteiro que aponta para um rótulo em uma lista categórica, sem implicar uma distância medida entre rótulos.
Um código de categoria para um país é um identificador de armazenamento, então não o trate como a posição numérica do país em uma classificação.
Coerção de tipo
A coerção de tipo em to_numeric converte valores que podem ser interpretados em números e transforma entradas que não podem ser interpretadas em valores ausentes, em vez de gerar um erro.
Após a coerção, inspecione o texto original de cada massa que se tornou ausente para encontrar formatação não reconhecida.
Coluna indicadora
Uma coluna indicadora marca se uma linha pertence a uma categoria, geralmente com valores booleanos ou zeros e uns para entrada numérica.
Uma coluna indicadora de “blue” é verdadeira apenas nas linhas com o rótulo blue quando criada por get_dummies.
Combinação ausente
Uma combinação ausente é um conjunto de rótulos sem observação correspondente, que a transformação para o formato largo pode revelar como uma célula ausente em uma tabela retangular.
Uma combinação ausente de estação e mês aparece como NaN quando as leituras longas são desempilhadas.
Concatenação
A concatenação coloca objetos do pandas ao longo de linhas ou colunas enquanto alinha rótulos no outro eixo, sem associar valores comuns de chave.
A concatenação de linhas reúne lotes sucessivos de observações de pacotes em uma tabela mais longa.
Conversão de tipo
A conversão de tipo altera como os valores são armazenados e interpretados, por exemplo, transformando texto de dígitos em números para operações aritméticas.
A conversão de tipo é necessária antes que o texto “7.5” possa ser usado como uma massa medida em um cálculo numérico.
Cópia na escrita
A cópia na escrita impede que alterações em um objeto selecionado do pandas modifiquem sem aviso outro objeto que compartilha seus dados subjacentes.
Sob a cópia na escrita, atribua uma Series preenchida de volta à sua coluna no DataFrame para atualizar a tabela original.
Correspondência integral
Uma correspondência integral exige que a string de entrada inteira corresponda a um padrão, de modo que um fragmento válido dentro de um valor mais longo é insuficiente.
Uma correspondência integral de r"\d+" aceita “204” e rejeita “204x”, embora ambas as strings contenham dígitos.
Correspondência literal
A correspondência literal pesquisa exatamente os caracteres fornecidos, sem atribuir significado de padrão a símbolos especiais de expressões regulares, como um ponto.
Use correspondência literal para remover o ponto de um código sem tratá-lo como um padrão para qualquer caractere.

D

Discretização por quantis
A discretização por quantis divide medições ordenadas em grupos com contagens de observações aproximadamente iguais, permitindo que suas amplitudes numéricas sejam diferentes.
Use discretização por quantis com qcut para comparar grupos baixo, médio e alto que contenham números semelhantes de leituras.
Divisão de strings
A divisão de strings separa texto em um delimitador escolhido, produzindo listas de partes ou colunas separadas quando a expansão é solicitada.
A divisão de strings em “, ” transforma “Silva, Ana” em uma parte de sobrenome e uma parte de nome.

E

Eixo
Um eixo é uma direção de um objeto do pandas; a concatenação ao longo do eixo 0 adiciona linhas e ao longo do eixo 1 adiciona colunas.
Escolha o eixo 1 ao colocar duas Series de medição lado a lado em rótulos de índice correspondentes.
Escalonamento mínimo-máximo
O escalonamento mínimo-máximo subtrai o mínimo de uma coluna e divide por sua amplitude não nula, mapeando o mínimo observado para 0 e o máximo para 1.
Para as leituras 2, 5, 8, o escalonamento mínimo-máximo fornece 0, 0,5, 1 usando a amplitude original de 6.
Escore z
Um escore z expressa um valor como sua distância acima ou abaixo da média dividida pelo desvio padrão usado para essa coluna.
Um escore z de -1 coloca uma leitura um desvio padrão abaixo da média, não em um intervalo nomeado.
Expressão regular
Uma expressão regular é um padrão de texto construído com regras de caracteres e repetição, usado para testar, extrair ou substituir texto estruturado.
Uma expressão regular pode encontrar uma massa inteira seguida de “kg” mesmo quando o espaçamento varia.

F

Formato largo
O formato largo distribui medições em várias colunas, frequentemente dando a cada entidade uma linha e a cada rótulo de medição sua própria coluna.
O formato largo coloca três valores anuais de vendas lado a lado para cada cidade, permitindo comparação direta entre anos.
Formato longo
O formato longo armazena rótulos de medição como valores em colunas de identificação, com observações em linhas e uma coluna compartilhada de valores de medição.
O formato longo coloca cidade, ano e vendas em colunas, de modo que cada observação de cidade/ano ocupe uma linha.

G

Grupo de captura
Um grupo de captura marca parte de uma expressão regular com parênteses para que o texto correspondente possa ser retornado como um campo de saída extraído.
Um grupo de captura ao redor dos dígitos em um padrão de massa retorna “14” do texto “Lentils 14 kg”.

I

Imputação
A imputação substitui dados ausentes por valores estimados ou escolhidos, preservando linhas enquanto altera a distribuição observada de uma coluna.
A imputação pela média preenche uma temperatura ausente com a média das leituras conhecidas e reduz a dispersão aparente.
Indicador de origem da junção
Um indicador de origem da junção identifica cada linha resultante pela origem da correspondência: ambas as entradas, apenas a entrada esquerda ou apenas a entrada direita.
Conte o indicador de origem da junção após uma junção externa completa para localizar linhas que não encontraram correspondência em algum dos lados.
Interpolação
A interpolação estima valores entre leituras conhecidas; a interpolação linear do pandas usa suas posições para preencher uma trajetória em linha reta.
A interpolação transforma as leituras ordenadas 8, NaN, 12 em 8, 10, 12 quando uma estimativa em linha reta é adequada.
Intervalo de classe
Um intervalo de classe é um intervalo numérico usado para agrupar medições, com extremos definidos que determinam a qual grupo pertencem os valores nos limites.
Em um intervalo de classe escrito (0, 10], a medição 10 é incluída e a medição 0 é excluída.

Í

Índice hierárquico (MultiIndex)
Um índice hierárquico identifica uma linha ou coluna do pandas com vários níveis de rótulos, de modo que um rótulo completo é uma tupla de valores entre esses níveis.
Um índice hierárquico com cidade e ano identifica separadamente as medições da mesma cidade para cada ano.

J

Junção à esquerda
Uma junção à esquerda preserva cada linha do lado esquerdo e suas correspondências, fornecendo campos ausentes à direita quando uma chave esquerda não tem correspondência.
Uma junção à esquerda mantém um pedido com chave de cliente desconhecida para que suas informações ausentes de consulta permaneçam visíveis.
Junção externa completa
Uma junção externa completa preserva chaves encontradas em qualquer um dos lados, mostrando campos ausentes quando uma chave não tem linha correspondente na outra entrada.
Uma junção externa completa revela tanto pedidos sem informações de clientes quanto clientes sem pedido registrado.
Junção interna
Uma junção interna mantém pares de linhas cujas chaves correspondem nos dois lados, excluindo observações sem chave correspondente na outra tabela.
Uma junção interna descarta uma entrega cujo identificador de estação não tem linha correspondente na tabela de consulta de estações.
Junção pelo índice
Uma junção pelo índice associa tabelas por rótulos de índice; join do pandas usa o índice direito mesmo quando uma coluna de chave esquerda é especificada.
Uma junção pelo índice pode adicionar altitudes de estações a leituras repetidas sem associá-las pela posição da linha.
Junção por chaves
Uma junção por chaves associa linhas por valores de chave e combina seus campos, produzindo todos os pares correspondentes permitidos pelo tipo de junção escolhido.
Uma junção por chaves adiciona uma linha de consulta de cliente a cada pedido cuja chave de cliente tenha um valor correspondente.

L

Limitação de valores extremos
A limitação de valores extremos substitui medições além de um limite escolhido pelo próprio limite, mantendo as observações enquanto altera seus valores.
Limitar a 80 kg altera uma entrada de 95 kg para 80 kg, então inspecione primeiro se essa leitura extrema é real.
Linha duplicada
Uma linha duplicada repete outra linha em todas as colunas comparadas; por padrão, o pandas marca cópias posteriores e ignora rótulos de índice.
Uma linha duplicada com um índice numérico diferente ainda conta como cópia quando todos os seus valores de dados correspondem.

M

Marcador de data ou hora ausente (NaT)
NaT é o marcador do pandas para valores ausentes de data e hora, permitindo que uma coluna de data e hora represente uma data ou marca temporal indisponível.
Uma data de inspeção ausente aparece como NaT, e isna() a detecta junto com leituras numéricas ausentes.
Máscara de valores ausentes
Uma máscara de valores ausentes é um objeto booleano que marca onde os valores estão ausentes, com os mesmos rótulos e forma do objeto verificado.
Somar uma máscara de valores ausentes por coluna mostra quantas células de temperatura e chuva precisam de atenção.
Método combine_first
O método combine_first mantém os valores conhecidos de um primeiro objeto, preenche suas lacunas com valores de rótulos correspondentes em outro objeto e adiciona novos rótulos.
Use combine_first para preencher medições ausentes com uma fonte de reserva enquanto mantém valores conhecidos da fonte principal.
Método dropna
O método dropna remove linhas ou colunas de acordo com seus valores ausentes, com opções para colunas selecionadas e contagens exigidas de valores presentes.
Use dropna(subset=["mass_kg"]) quando linhas utilizáveis precisarem ter uma massa mesmo que outro campo esteja incompleto.
Método map
O método map transforma valores de uma Series por meio de uma função ou consulta; uma consulta por dicionário torna ausentes as chaves desconhecidas.
Um map de códigos de países revela códigos ausentes do dicionário como lacunas que o analista pode inspecionar.
Método melt
O método melt transforma colunas de medição em linhas de rótulo/valor enquanto preserva e repete as colunas identificadas como identificadores de linha.
Um melt de quatro colunas de ano cria quatro linhas por cidade, incluindo linhas para células de medição vazias.
Método pivot
O método pivot transforma dados longos em largos colocando pares escolhidos de índice/coluna em células e gera erro quando um par identifica vários valores.
Um pivot de estação e mês exige uma leitura para cada célula de estação/mês na saída.
Método pivot_table
O método pivot_table combina valores de pares repetidos de índice/coluna por meio de uma agregação, usando a média quando nenhuma é especificada.
Use pivot_table com aggfunc="sum" quando remessas separadas devam ser somadas em um total diário.
Método rename
O método rename altera rótulos de linhas ou colunas por meio de um mapeamento ou uma função, deixando intactos os valores de dados armazenados.
Use rename(columns={"Weight": "mass_kg"}) para dar um significado claro a um cabeçalho sem editar suas células.
Método replace
O método replace substitui valores exatamente correspondentes e deixa entradas sem correspondência inalteradas, usando um escalar, uma lista ou um dicionário.
Um dicionário de replace pode alterar “pending” para “open” sem modificar os outros valores de status.
Método reset_index
O método reset_index move um ou mais níveis do índice para colunas comuns e fornece um índice para a disposição restante.
Use reset_index(level="year") para restaurar ano como coluna enquanto mantém cidade no índice.
Método stack
O método stack move um nível de rótulos de coluna para um nível interno do índice de linhas, retornando uma Series ou um DataFrame conforme os níveis restantes.
Chamar stack em uma tabela de cidades com colunas de ano fornece pares de índice cidade/ano para os mesmos valores de vendas.
Método unstack
O método unstack move um nível do índice de linhas para as colunas, exigindo rótulos completos de índice únicos para colocar um valor em cada célula de saída.
Use unstack("year") para colocar cada ano em uma coluna de vendas separada para cada cidade.

N

Nível do índice
Um nível do índice é um componente rotulado de um índice hierárquico, como cidade ou ano, com uma posição e um nome opcional.
Mover ano para o nível externo do índice faz de ano o primeiro rótulo usado por uma seleção loc com um único rótulo.

O

Opção ignore_index
A opção ignore_index substitui rótulos ao longo do eixo de concatenação por inteiros consecutivos, preservando o alinhamento no outro eixo.
Defina ignore_index=True quando arquivos mensais tiverem números de linha descartáveis que, de outro modo, se repetiriam.
Operação vetorizada
Uma operação vetorizada atua sobre uma Series ou um array inteiro, expressando o mesmo cálculo para todos os valores sem um laço Python por item.
Multiplicar a coluna de quilômetros por 1000 é uma operação vetorizada que produz distâncias em metros.
Ordenação pelo índice
A ordenação pelo índice ordena linhas por seus rótulos de índice, permitindo usar intervalos de rótulos e agrupando um MultiIndex conforme a ordem de seus níveis.
Aplique ordenação pelo índice após trocar os níveis de cidade e ano para que as linhas sigam a nova ordem com ano primeiro.

P

Padronização de maiúsculas e minúsculas
A padronização de maiúsculas e minúsculas dá ao texto uma forma consistente para que versões em maiúsculas e minúsculas possam ser comparadas como o mesmo rótulo.
A padronização de maiúsculas e minúsculas faz “PUNE” e “pune” corresponderem antes que seus registros sejam contados ou unidos.
Preenchimento com o próximo valor válido
O preenchimento com o próximo valor válido copia o próximo valor conhecido para lacunas anteriores, então seu significado depende da ordem das observações.
O preenchimento com o próximo valor válido usa a leitura conhecida seguinte como valor de preenchimento para uma leitura anterior indisponível.
Preenchimento com o último valor válido
O preenchimento com o último valor válido copia o valor conhecido mais recente para lacunas posteriores em uma ordem de linhas significativa, parando em um limite opcional de preenchimentos consecutivos.
O preenchimento com o último valor válido pode levar uma configuração estável de instrumento para a próxima linha, mas não pode preencher uma lacuna inicial.

R

Relacionamento muitos para um
Um relacionamento muitos para um permite chaves esquerdas repetidas, mas exige chaves direitas únicas, como muitos pedidos correspondendo a um registro de cliente.
Valide um relacionamento muitos para um ao enriquecer entregas com uma tabela de consulta que tem uma linha por estação.
Remodelagem
A remodelagem altera como valores e seus rótulos de identificação são organizados entre linhas e colunas sem, por si só, escolher uma agregação.
A remodelagem de uma Series completa de cidade/ano em uma tabela larga preserva cada valor em sua combinação de cidade/ano.
Repetição gulosa
A repetição gulosa corresponde à maior quantidade possível de texto que ainda permita a correspondência do restante do padrão, às vezes abrangendo vários delimitadores.
A repetição gulosa em r"<.*>" pode abranger ambas as tags e o texto entre elas em uma pequena string com marcação.

S

Seção transversal
Uma seção transversal seleciona um valor de um nível de índice nomeado entre outros níveis, permitindo a seleção direta de um nível interno.
Uma seção transversal para o ano 2026 recupera esse ano em todas as cidades de um MultiIndex de cidade/ano.
String bruta
Uma string bruta é uma forma de string Python prefixada com r que preserva barras invertidas para usos como padrões de expressões regulares.
Escreva um padrão de dígitos como string bruta, r"\d+", para que sua barra invertida chegue ao mecanismo de expressões regulares.
Sufixo
Um sufixo é um texto acrescentado a nomes compartilhados de colunas que não são chaves durante uma combinação, mantendo distinguível a origem de cada coluna.
Um sufixo como _sensor mantém uma coluna de leitura distinta da coluna de mesmo nome em uma tabela de reserva.

T

Tipo categórico ordenado
Um tipo categórico ordenado tem uma sequência declarada de rótulos que determina a ordenação e as comparações ordenadas em vez da grafia alfabética.
Um tipo categórico ordenado com S, M, L coloca os tamanhos na sequência pretendida quando a coluna é ordenada.
Tipo de dados categórico
Um tipo de dados categórico armazena uma lista definida de rótulos e um código inteiro por linha, com uma ordenação significativa opcional dos rótulos.
Um tipo de dados categórico pode armazenar um pequeno conjunto de rótulos repetidos de tamanho de produto com mais eficiência que texto repetido.
Tipo de dados com suporte a valores ausentes
Um tipo de dados com suporte a valores ausentes armazena valores de um tipo especificado junto com um marcador de valor ausente, como "Int64" para inteiros com pd.NA.
Um tipo de dados com suporte a valores ausentes mantém contagens de pacotes como inteiros mesmo quando um registro tem contagem desconhecida.

U

União de categorias
Uma união de categorias combina os rótulos permitidos por entradas categóricas para que a concatenação possa manter uma saída categórica entre listas diferentes.
Use uma união de categorias quando dois lotes têm cores permitidas diferentes e a coluna combinada deve manter ambas as listas.
Unicidade
A unicidade significa que nenhum valor de chave ou combinação de chaves verificada se repete, um requisito para tabelas de consulta com uma linha por chave.
Verifique a unicidade na tabela de consulta de clientes antes de adicionar suas informações a uma tabela com muitos pedidos.

V

Valor ausente
Um valor ausente marca uma observação desconhecida ou indisponível usando um marcador reconhecido pelo pandas no lugar de dados comuns.
Um valor ausente em rain_mm significa que a leitura está indisponível, portanto deve ser distinguido da ausência de chuva.
Valor não numérico (NaN)
NaN é um marcador de valor ausente usado em colunas de ponto flutuante e nas colunas de texto padrão do pandas 3; ele é diferente de si mesmo em testes comuns de igualdade.
Use isna() para encontrar NaN na coluna de temperatura antes de contar as leituras disponíveis para uma média.

Sobre esta aula

Por StudeliRelatar um erro

Crie seus próprios Materiais de Estudo

Transforme suas anotações, slides e documentos em Guias de Estudo, Questões de Prática, Flashcards e mais 6 ferramentas.

Começar