- Aprender
- Computação e TI
- Ciência de dados e IA
- Análise de dados com Python
- Series e DataFrames no pandas
Series e DataFrames no pandas: primeiros passos
loc e por posição com iloc. Filtre linhas por condições, adicione e transforme colunas, ordene valores e atribua postos a eles, e resuma dados com estatísticas descritivas, contagens de ocorrências por valor e correlação. Os exemplos seguem o pandas 3.IntermediárioAula 2 de 8 do curso Curso de Análise de dados com Python
O que você vai aprender
- Descrever como o pandas armazena dados unidimensionais e bidimensionais com rótulos, construir Series e DataFrames a partir de dados Python e gerenciar seus rótulos de linhas e colunas.
- Criar uma Series e usar seu índiceConstruir uma Series a partir de uma lista ou dicionário, ler seus valores, índice, tipo de dados e nome, e prever como os rótulos se comportam em operações aritméticas e consultas.
- Construir um DataFrame e interpretar sua estruturaCriar um DataFrame a partir de dados Python, ler sua forma, colunas, índice e tipos de dados, selecionar uma coluna como Series e usar corretamente o argumento axis.
- Definir, redefinir, renomear e remover rótulosEscolher um índice de linhas significativo, movê-lo de volta para uma coluna, renomear e remover linhas ou colunas e manter os resultados por reatribuição.
- Criar uma Series e usar seu índice
- Ler um arquivo CSV em um DataFrame com as opções adequadas, inspecionar o resultado sistematicamente e converter colunas para os tipos necessários à análise.
- Ler um arquivo CSV com read_csvCarregar um arquivo separado por vírgulas com
pd.read_csv, compreender como o pandas infere os tipos de colunas e usar as opções para separadores, decimais, cabeçalhos, valores ausentes e identificadores. - Inspecionar um novo DataFrameVerificar uma tabela recém-carregada com
head,info,shape,dtypes, contagens de valores ausentes e contagens de valores distintos antes de analisá-la. - Converter colunas para os tipos adequadosAlterar o tipo de dados de uma coluna com
astype,pd.to_numericepd.to_datetimee manter a coluna convertida por reatribuição.
- Ler um arquivo CSV com read_csv
- Selecionar exatamente as linhas, colunas e valores individuais necessários com
loc(rótulos) eiloc(posições), e prever a forma e o tipo de cada resultado.- Selecionar linhas e colunas por rótulo com locUsar
df.loc[rows, columns]com rótulos individuais, listas, fatias com extremos inclusos e máscaras booleanas, e reconhecer quando um rótulo não existe. - Selecionar por posição com iloc e escolher o indexador adequadoUsar
df.iloc[rows, columns]com posições inteiras, fatias com extremo final excluído e posições negativas, ler valores individuais comateiate decidir entre seleção por rótulo e por posição.
- Selecionar linhas e colunas por rótulo com loc
- Manter apenas as linhas que atendem a uma ou mais condições, usando máscaras booleanas, métodos auxiliares para testes comuns e
query, e alterar valores nas linhas selecionadas com segurança.- Filtrar com máscaras booleanasConstruir uma máscara True/False a partir de uma comparação, combinar condições com
&,|e~, contar correspondências e compreender como valores ausentes se comportam em comparações. - Usar métodos auxiliares e query para filtros comunsFiltrar com
isin,between,isna/notnaestr.containse escrever as mesmas condições como uma string legível emquery. - Alterar valores nas linhas selecionadas com segurançaAtualizar valores nas linhas que atendem a uma condição com uma única atribuição usando
loce evitar a atribuição encadeada, que não altera a tabela original no pandas 3.
- Filtrar com máscaras booleanas
- Criar novas colunas a partir das existentes com aritmética vetorizada e
assigne recodificar ou transformar valores comnp.where,map,applyereplace.- Calcular novas colunas a partir das existentesAdicionar ou sobrescrever uma coluna com aritmética vetorizada, usar
assignpara construir colunas em uma sequência de métodos e prever como valores ausentes e o alinhamento por índices afetam o resultado. - Recodificar e transformar valores com np.where, map e applyTransformar condições em rótulos com
np.where, traduzir valores commapereplace, aplicar suas próprias funções comapplye preferir formas vetorizadas quando existirem.
- Calcular novas colunas a partir das existentes
- Ordenar linhas por uma ou mais colunas, atribuir postos aos valores com uma regra adequada para empates, calcular estatísticas descritivas para colunas numéricas e de texto e contar valores e relações.
- Ordenar linhas por valores ou pelo índiceOrdenar um DataFrame por uma ou várias colunas em qualquer direção, controlar a posição de valores ausentes e empatados e encontrar as primeiras ou últimas linhas.
- Atribuir postos aos valores e tratar empatesAtribuir a cada valor seu posto com
rank, escolher um método de desempate adequado ao objetivo e expressar postos como percentis. - Resumir colunas com estatísticas descritivasCalcular contagens, totais, medidas de tendência central, dispersão e quartis com métodos do pandas e
describe, interpretá-los e tratar corretamente valores ausentes e colunas de texto. - Contar valores e medir relaçõesContar quantas vezes cada valor ocorre, listar valores distintos, expressar contagens como proporções e medir a relação linear entre duas colunas numéricas com correlação.
- Ordenar linhas por valores ou pelo índice
Guia de estudo de Series e DataFrames no pandas
1Compreender Series e DataFrames
Rótulos transformam uma sequência de números em dados que você pode identificar e combinar. Construa uma Series para uma variável e um DataFrame para várias variáveis, depois leia suas dimensões e tipos. Você verá por que a correspondência de rótulos importa na aritmética, como uma coluna difere de uma tabela de uma coluna e como escolher, redefinir ou renomear um índice altera consultas posteriores. Essas estruturas sustentam todas as seleções e cálculos a seguir.
1.1 Criar uma Series e usar seu índice
Uma Series mantém uma sequência de valores junto com rótulos. Esses rótulos dão significado aos valores: uma medição de chuva pertence a um dia, e uma população pertence a uma cidade. Importe pandas e NumPy usando seus nomes curtos habituais.
import pandas as pd
import numpy as np
rain = pd.Series([4.5, 3.0, 6.2],
index=["Mon", "Tue", "Wed"], name="rain_mm")
Ler valores e rótulos
Os valores são 4,5; 3,0 e 6,2; o índice é Mon, Tue e Wed. Sem index=, o pandas fornece os rótulos 0, 1 e 2. Um dicionário fornece ambos de uma vez: pd.Series({"Lima": 10, "Oslo": 5, "Pune": 7}) obtém seus rótulos das chaves, na ordem do dicionário.
Atributos descrevem a Series sem parênteses: rain.index contém os rótulos, rain.dtype é float64, rain.name é "rain_mm" e rain.size é 3. Use rain.to_numpy() quando precisar de um array do NumPy. O atributo mais antigo .values retorna tipos diferentes de array para tipos de dados diferentes; dados de texto podem produzir um array do pandas.
Um tipo de dados informa ao pandas que tipo de valores ele armazena. Tipos comuns são int64 para números inteiros, float64 para decimais, bool para True/False, str para texto e datetime64 para datas e horas. O pandas 3 infere texto como str; exemplos antigos frequentemente exibem object.
Trabalhar com a Series inteira
Para s = pd.Series([10, 20, 30], index=["a", "b", "c"]), s * 2 produz os valores 20, 40 e 60. s > 15 produz False, True e True. Ambos mantêm os rótulos. Essas operações são vetorizadas: uma expressão opera sobre a Series inteira sem um laço Python.
Consulte um rótulo com s["b"], que produz 20. Consulte uma posição com s.iloc[0], que produz 10. A expressão "b" in s verifica o índice; 20 in s é False. Mesmo um inteiro entre colchetes é um rótulo: com o índice [2, 0, 1], s[0] significa o rótulo 0, não a primeira entrada. Com rótulos de texto, s[0] gera KeyError no pandas 3.
Associar rótulos na aritmética
a = pd.Series([1, 2, 3], index=["x", "y", "z"])
b = pd.Series([10, 20, 30], index=["y", "z", "w"])
a + b
O rótulo compartilhado y combina 2 e 10 para produzir 12,0; z combina 3 e 20 para produzir 23,0. Os rótulos w e x aparecem em apenas uma entrada, então recebem NaN. O resultado inclui os quatro rótulos. Somar pela posição visual das linhas produziria incorretamente 11, 22 e 33.
Use a.add(b, fill_value=0) quando um valor ausente deve contar como zero. Seus resultados são w 30,0, x 1,0, y 12,0 e z 23,0. Métodos relacionados incluem sub, mul e div.
Reconhecer valores ausentes
Um valor ausente de ponto flutuante ou str usa NaN; uma data ou hora ausente usa NaT; um inteiro ausente em um tipo com suporte a valores ausentes usa <NA>. pd.Series([1, None, 3]) se torna float64, exibindo 1,0, NaN e 3,0, porque o tipo comum int64 não pode armazenar NaN.
Principais conclusões
- Uma Series combina uma sequência de valores com um índice, um tipo de dados e um nome opcional.
- Use um rótulo para consulta e
ilocpara uma posição; testes de pertencimento verificam os rótulos. - A aritmética vetorizada atua sobre cada valor mantendo o índice.
- Duas Series são alinhadas por rótulo; rótulos sem correspondência recebem resultados ausentes, a menos que um valor de preenchimento seja fornecido.
- Marcadores de valores ausentes dependem do tipo de dados:
NaN,NaTou<NA>.
1.2 Construir um DataFrame e interpretar sua estrutura
Um DataFrame é uma tabela bidimensional. Cada linha registra uma observação, como um pedido; cada coluna contém uma variável, como uma quantidade. As colunas podem ter tipos de dados diferentes, mas compartilham o mesmo índice de linhas.
Construir uma tabela a partir de dados Python
df = pd.DataFrame({
"product": ["Notebook", "Desk lamp", "Pen set", "Mug"],
"quantity": [3, 1, 2, 4],
"unit_price": [2.50, 18.00, 4.75, 6.00]
})
Cada chave do dicionário se torna um nome de coluna; cada lista fornece os valores dessa coluna. As listas devem ter o mesmo comprimento para que cada linha tenha um lugar em cada coluna. Aqui os rótulos do índice vão de 0 a 3. Listas de comprimentos diferentes geram um ValueError.
Uma lista de dicionários, por sua vez, fornece um dicionário por linha. pd.DataFrame([{"a": 1, "b": 2}, {"a": 3, "c": 4}]) cria as colunas a, b e c. O b ausente na segunda linha e o c ausente na primeira se tornam NaN, então essas colunas usam float64. Um array bidimensional do NumPy também pode fornecer valores, com columns=[...] nomeando as colunas.
Ler as dimensões da tabela
df.shape é (4, 3): quatro linhas e três colunas, nessa ordem. len(df) é 4, enquanto df.size é 12 porque conta células. df.index contém rótulos de linhas, df.columns contém rótulos de colunas e df.dtypes fornece um tipo de dados por coluna. Esses são atributos: df.shape() tenta chamar uma tupla e gera TypeError. df.T troca linhas por colunas.
Manter uma Series ou uma tabela
| Seleção | Resultado |
|---|---|
df["quantity"] | Uma Series |
df[["quantity"]] | Um DataFrame de uma coluna |
df[["product", "unit_price"]] | Um DataFrame com duas colunas nessa ordem |
A lista interna solicita uma coleção de colunas. Sem ela, df["product", "unit_price"] fornece uma única chave em forma de tupla, que não corresponde a nenhum dos nomes comuns de coluna e gera KeyError.
Colchetes também funcionam quando os nomes contêm espaços ou entram em conflito com métodos. A notação com ponto, como df.quantity, só funciona para nomes adequados. Uma coluna chamada size precisa de df["size"], porque df.size significa o número de células da tabela. Crie colunas também com colchetes: df["total"] = 5 adiciona uma coluna, enquanto df.total = 5 não adiciona.
Escolher um eixo
Para numbers = pd.DataFrame({"a": [1, 2], "b": [3, 4]}), numbers.sum() soma ao longo das linhas, produzindo a 3 e b 7. Esse é o axis=0, também chamado de "index". numbers.sum(axis=1) soma ao longo de cada linha, produzindo 4 e 6; esse eixo também é chamado de "columns". Identifique primeiro o resultado necessário: um total por coluna ou um total por linha.
Extrair uma linha cria uma Series cujos rótulos são os nomes das colunas. Essa Series precisa de um tipo de dados capaz de armazenar todas as células da linha. Uma linha que mistura inteiros e números de ponto flutuante se torna float64; uma linha que mistura texto e números se torna object. As colunas originais mantêm seus tipos separados.
Principais conclusões
- Um DataFrame tem um índice de linhas compartilhado e um tipo de dados por coluna.
- Listas de mesmo comprimento fornecem colunas; uma lista de dicionários fornece linhas.
shapeconta linhas e colunas;sizeconta células.- Um único nome de coluna retorna uma Series; uma lista de nomes retorna um DataFrame.
axis=0reduz ao longo das linhas;axis=1reduz ao longo das colunas.- Use colchetes para nomes de colunas que entram em conflito com atributos ou métodos.
1.3 Definir, redefinir, renomear e remover rótulos
Rótulos de linhas podem ter significado, como um número de pedido, ou apenas identificar as linhas atuais. Escolher um índice útil facilita a interpretação de consultas e resultados posteriores. Alterar rótulos retorna uma nova tabela, então mantenha o resultado com uma atribuição.
Mover um identificador para o índice
orders = pd.DataFrame({
"order_id": [1001, 1002, 1003],
"product": ["Notebook", "Desk lamp", "Pen set"],
"unit_price": [2.50, 18.00, 4.75]
})
orders_by_id = orders.set_index("order_id")
A tabela original tem um RangeIndex padrão: 0, 1 e 2. A nova tabela tem os rótulos 1001, 1002 e 1003. order_id saiu das colunas e passou para o índice. orders_by_id.loc[1002] agora identifica a linha de Desk lamp pelo identificador.
Chamar orders.set_index("order_id") sem salvar o resultado deixa orders inalterado. Uma reatribuição, como orders = orders.set_index("order_id"), mantém a nova estrutura. No pandas 3.1, inplace= está obsoleto para esses métodos de alteração de rótulos e para ordenação; use atribuição.
Mover rótulos de volta para uma coluna
orders_by_id.reset_index() restaura order_id como uma coluna comum e fornece um novo RangeIndex. Um índice sem nome se torna uma coluna chamada index. Isso preserva a identidade antiga das linhas.
reset_index(drop=True) descarta os rótulos antigos. Para um índice [10, 20, 30], reset_index() mantém esses números em uma coluna index; reset_index(drop=True) os perde e usa 0, 1 e 2. Após filtrar ou ordenar, decida se os rótulos antigos são úteis antes de descartá-los. Renumerar o índice não altera os valores dos dados nem desfaz uma ordenação.
Renomear ou remover rótulos
renamed = orders.rename(columns={"unit_price": "price"})
short = orders.drop(columns=["product"])
remaining = orders.drop(index=[0, 1])
rename associa rótulos antigos a novos e mantém os nomes não listados. Por padrão, um nome antigo escrito incorretamente é ignorado, então inspecione .columns se uma renomeação parecer não ter feito nada. Para substituir todos os nomes de colunas, atribua uma lista completa a orders.columns; seu comprimento deve corresponder ao número de colunas.
drop(columns=...) remove colunas; drop(index=...) remove linhas por rótulo. Um rótulo ausente gera KeyError. Após ordenar, o rótulo 0 pode não estar mais na primeira linha: removê-lo ainda remove a linha com rótulo 0.
Selecione uma lista para escolher a ordem das colunas: orders = orders[["order_id", "unit_price", "product"]]. Colunas ausentes dessa lista são removidas do resultado.
Verificar se um identificador realmente identifica uma linha
Rótulos de índice podem se repetir. Verifique orders_by_id.index.is_unique antes de tratá-los como identificadores únicos. Se o rótulo 1002 ocorrer duas vezes, .loc[1002] retornará ambas as linhas como um DataFrame. Com rótulos únicos, a mesma consulta por um único rótulo retorna uma Series.
Um índice significativo também melhora os resumos. Em uma tabela meteorológica indexada por dia, weather["temp_c"].idxmax() informa um dia como "Thu"; com um índice padrão, informa um número de linha.
Principais conclusões
set_indexmove uma coluna para os rótulos de linha;reset_indexmove os rótulos de volta para uma coluna.reset_index(drop=True)descarta os rótulos antigos.- Mantenha as alterações de rótulos atribuindo a tabela retornada.
renamealtera os rótulos informados;dropremove linhas ou colunas por rótulo.- Um índice pode conter duplicatas; verifique a unicidade antes de usá-lo como identificador.
2Carregar um arquivo CSV e verificar os dados carregados
Uma tabela carregada precisa ser verificada antes que seus números possam sustentar uma análise. Ajuste as opções de CSV ao delimitador, ao cabeçalho e às convenções de valores do arquivo e inspecione o resultado em busca das linhas, nomes e tipos esperados. Investigue entradas ausentes e identificadores repetidos e converta texto numérico ou de datas quando necessário. Pequenas escolhas na importação importam: um zero à esquerda perdido ou uma data não interpretada pode mudar o significado do código posterior.
2.1 Ler um arquivo CSV com read_csv
Um CSV armazena uma tabela como texto: registros ocupam linhas e um delimitador separa os campos. A primeira linha frequentemente contém nomes de colunas. Carregar o arquivo corretamente exige identificar tanto sua estrutura quanto o significado de seus valores.
Carregar a tabela de pedidos
orders = pd.read_csv("orders.csv")
Um caminho relativo é resolvido a partir do diretório de trabalho atual do Python. Uma localização incorreta gera FileNotFoundError. Um caminho absoluto ou uma URL também pode ser passado a read_csv.
Os exemplos usam este arquivo. A última linha tem um campo de quantidade vazio.
order_id,date,product,category,quantity,unit_price
1001,2026-03-02,Notebook,Stationery,3,2.50
1002,2026-03-02,Desk lamp,Home,1,18.00
1003,2026-03-03,Pen set,Stationery,2,4.75
1004,2026-03-04,Mug,Home,4,6.00
1005,2026-03-04,Backpack,Bags,1,35.00
1006,2026-03-05,Notebook,Stationery,,2.50
Com as opções padrão, o resultado tem forma (6, 6) e rótulos de índice de 0 a 5. O pandas infere os tipos: order_id é int64, unit_price é float64 e quantity também se torna float64 porque seu campo em branco se torna NaN. As outras colunas, incluindo date, são str. Uma string que parece uma data ainda é texto até ser interpretada.
Ajustar à estrutura do arquivo
| Característica do arquivo | Opção de leitura |
|---|---|
| Campos separados por ponto e vírgula | sep=";" |
| Vírgulas decimais | decimal="," |
| Sem linha de cabeçalho | header=None, names=["id", "product"] |
| Duas linhas extras antes do cabeçalho | skiprows=2 |
| Apenas campos selecionados são necessários | usecols=["product", "quantity"] |
| Uma prévia curta | nrows=100 |
Para um arquivo cujas linhas são a;b, 1,5;2 e 3,0;4, use pd.read_csv("file.csv", sep=";", decimal=","). A coluna a contém então 1,5 e 3,0. Usar a vírgula como separador padrão produz uma coluna chamada a;b, um sinal para verificar o delimitador.
index_col="order_id" transforma essa coluna no índice de linhas durante o carregamento. thousands="," lê um campo como "1,200" como 1200; em um arquivo separado por vírgulas, o campo precisa estar entre aspas conforme as regras do CSV para que sua vírgula interna não seja outro delimitador.
Preservar o significado ao inferir tipos
Códigos como "001" são identificadores, não quantidades. dtype={"id": str} preserva seus zeros à esquerda. Se o pandas primeiro os converter para 1, converter esse número de volta para texto não consegue recuperar quantos zeros o arquivo continha.
Campos vazios e marcadores comuns como NA, N/A, NULL, NaN e None são ausentes por padrão. Adicione um marcador específico do arquivo com na_values=["-"]. Essas são regras de carregamento, então verifique as convenções do arquivo quando um código parecer um marcador de valor ausente.
Use parse_dates=["date"] para ler as datas do exemplo como valores de data e hora. No pandas 3, essas datas usam resolução de microssegundos, datetime64[us]. UTF-8 é a codificação de texto padrão. Um UnicodeDecodeError exige verificar a codificação do arquivo e fornecer a opção correspondente, como encoding="latin-1".
Principais conclusões
read_csvretorna um DataFrame e infere os tipos das colunas.- Ajuste
sep,decimale as opções de cabeçalho à estrutura do arquivo. - Preserve zeros à esquerda em identificadores usando um tipo de texto durante o carregamento.
- Campos em branco e marcadores comuns de valores ausentes se tornam valores ausentes;
na_valuesadiciona marcadores. - Datas precisam ser interpretadas, com
parse_datesdurante o carregamento ou por conversão posterior. - Um caminho relativo é resolvido a partir do diretório de trabalho atual.
2.2 Inspecionar um novo DataFrame
Uma leitura bem-sucedida significa que o pandas conseguiu interpretar o arquivo. Isso não estabelece que as colunas, os tipos e os valores ausentes correspondam ao que a tabela deve representar. Inspecione o novo DataFrame antes de fazer cálculos com ele.
Verificar linhas visíveis e dimensões
orders.head(3)
orders.tail()
orders.shape
orders.columns.tolist()
head() mostra cinco linhas por padrão; head(3) mostra três. tail() verifica o fim, onde uma exportação pode conter registros diferentes. sample(3, random_state=0) fornece uma amostra aleatória reproduzível de três linhas. Em um caderno computacional, a expressão final de uma célula é exibida automaticamente; em outros ambientes, use print.
O arquivo de pedidos deve conter seis linhas e seis colunas. Uma prévia deve mostrar colunas nomeadas e o primeiro pedido como dado. Se o primeiro registro aparecer entre os nomes das colunas, o arquivo provavelmente não tem cabeçalho e precisa de header=None. Se tudo ocupar uma única coluna larga, verifique sep.
Os nomes das colunas devem corresponder exatamente, incluindo maiúsculas, minúsculas e espaços. orders["Product"] falha quando o nome é product. Inspecionar a lista facilita a identificação de espaços no fim. orders.columns = orders.columns.str.strip() remove espaços das extremidades dos nomes do cabeçalho.
Ler a estrutura com info
orders.info() exibe o intervalo do índice, o nome de cada coluna, a contagem de valores presentes, o tipo de dados e o uso de memória. No exemplo de seis linhas, quantity tem cinco valores não nulos; as outras colunas têm seis cada. Os tipos são duas colunas de ponto flutuante, uma coluna inteira e três colunas str. orders.dtypes fornece uma lista compacta dos tipos.
Uma coluna aparentemente numérica com tipo str merece inspeção: um valor como "unknown", uma unidade como "12 kg" ou um separador de milhares não tratado pode impedir a inferência numérica. Datas também permanecem como texto, a menos que sejam interpretadas. Decida o tipo necessário pelo significado da coluna, não apenas por sua aparência em uma prévia.
Contar lacunas e valores repetidos
orders.isna().sum()
orders.isna().any(axis=1).sum()
orders.nunique()
isna() cria uma tabela booleana: True marca uma célula ausente. Somar ao longo de cada coluna conta essas células. Quantity tem um valor ausente e todas as outras colunas têm zero. Para contar as linhas afetadas, .any(axis=1) primeiro verifica se cada linha tem alguma lacuna, depois .sum() conta essas linhas. Somar todas as contagens das colunas poderia contar uma linha várias vezes.
nunique() conta valores presentes distintos: os pedidos têm seis identificadores, quatro datas, cinco produtos, três categorias, quatro quantidades e cinco preços. Compare a contagem de identificadores com a contagem de linhas para verificar a unicidade, junto com a contagem de identificadores ausentes. orders.duplicated(subset="product") marca a segunda linha com Notebook, de rótulo 5, como repetida. Um produto repetido é legítimo aqui; um identificador de pedido repetido exigiria investigação.
Ler uma visão geral numérica rápida
orders.describe() apresenta contagem, média, desvio padrão, mínimo, quartis e máximo para colunas numéricas. A contagem de quantity é cinco, então sua média resume cinco quantidades registradas. Verifique intervalos e unidades plausíveis, além dos tipos: uma coluna pode ser numérica e ainda conter um erro de entrada. Mantenha juntos a contagem observada de linhas e colunas, os tipos, as contagens de valores ausentes e a verificação de identificadores ao revisar um novo carregamento.
Principais conclusões
- Use prévias, dimensões, nomes exatos de colunas e tipos de dados em conjunto após o carregamento.
info()exibe contagens de valores não nulos e tipos; não retorna uma tabela de resumo.isna().sum()conta células ausentes por coluna;.any(axis=1).sum()conta linhas afetadas.- Verifique tanto os identificadores ausentes quanto o número de identificadores distintos.
- As contagens de
describe()mostram quantos valores registrados sustentam um resumo numérico.
2.3 Converter colunas para os tipos adequados
O tipo de dados de uma coluna determina quais operações fazem sentido. Uma coluna de texto contendo "12" ainda armazena texto; não é possível calcular sua média como a de uma coluna numérica. Converta deliberadamente e atribua o resultado de volta à tabela.
Escolher conversão estrita ou coerção
astype converte uma Series para um tipo especificado, como int, float, str ou "Int64". A conversão falha quando um valor não pode ser representado no tipo solicitado.
raw = pd.Series(["12", "7", "n/a", "3.5"])
numeric = pd.to_numeric(raw, errors="coerce")
raw.astype(float) gera ValueError em "n/a". Com errors="coerce", os valores de saída são 12,0; 7,0; NaN e 3,5. O valor que falhou se torna ausente em vez de interromper a conversão. Compare raw.isna().sum() com numeric.isna().sum(): zero valores ausentes passaram a ser um, identificando um valor que precisa de verificação.
A coerção é uma política de conversão, não uma evidência de que toda nova lacuna seja inofensiva. Use as contagens anteriores e posteriores para encontrar perdas. Armazene a conversão em uma nova variável ou coluna quando o texto bruto for útil para rastrear um valor cuja conversão falhou.
Manter números inteiros ausentes
A coluna de quantidade dos pedidos contém números inteiros e um NaN, então é float64. O astype(int) comum falha porque NaN não tem representação inteira comum.
orders["quantity"] = orders["quantity"].astype("Int64")
O I maiúsculo importa: Int64, com suporte a valores ausentes, mantém a lacuna como <NA> enquanto armazena os valores conhecidos como números inteiros. Essa escolha é adequada para contagens com entradas ausentes. Ela não transforma uma quantidade realmente fracionária em uma contagem inteira válida.
Separadores de milhares em texto também precisam ser tratados. pd.Series(["1,200", "950"]).str.replace(",", "").astype(int) produz 1200 e 950. Quando o próprio arquivo usa essa convenção, thousands="," pode tratá-la durante a leitura.
Converter texto de datas
orders["date"] = pd.to_datetime(orders["date"])
orders["date"].dt.day_name()
A conversão permite usar .dt.year, .dt.month, .dt.day e .dt.day_name(). Para as seis datas dos pedidos, os nomes dos dias são Monday, Monday, Tuesday, Wednesday, Wednesday e Thursday. Executar pd.to_datetime(orders["date"]) sozinho produz uma Series convertida, mas deixa a coluna original como texto. É a atribuição que mantém o resultado.
Armazenar categorias repetidas
orders["category"].astype("category") armazena rótulos repetidos por meio de um conjunto de categorias permitidas. Em tabelas grandes, isso geralmente economiza memória. Atribua o resultado para mantê-lo, assim como em outras conversões.
O tipo categórico altera algumas operações. Suas categorias não são ordenadas por padrão, então min() e max() geram TypeError. O value_counts() de uma coluna categórica também lista categorias conhecidas ausentes de uma seleção filtrada com contagem zero. Escolher o tipo categórico é útil para rótulos repetidos, mas também altera o comportamento, além do armazenamento.
Principais conclusões
astypefalha em conversões inválidas;to_numeric(errors="coerce")transforma valores inválidos em valores ausentes.- Compare as contagens de valores ausentes antes e depois da coerção.
Int64, com suporte a valores ausentes, armazena números inteiros com entradas ausentes.- Converta datas com
to_datetimee leia seus componentes por meio de.dt. - Mantenha as conversões atribuindo seus resultados.
- O tipo categórico não ordenado armazena rótulos repetidos com eficiência, mas altera alguns resumos.
3Selecionar dados por rótulo e por posição
Uma linha pode ser identificada por seu rótulo ou encontrada por sua posição atual. Aprenda a tornar essa escolha explícita com loc e iloc, selecionar as colunas necessárias ao mesmo tempo e prever se uma seleção retorna um valor, uma Series ou um DataFrame. Os extremos das fatias e os rótulos mantidos explicam muitos erros de uma posição. A distinção se torna especialmente útil após uma tabela ter sido ordenada ou filtrada.
3.1 Selecionar linhas e colunas por rótulo com loc
Os rótulos permitem solicitar uma linha ou coluna pelo seu significado. Com loc, um número de pedido identifica uma linha mesmo que a tabela tenha sido ordenada. A seleção tem uma parte para linhas seguida de uma parte para colunas: df.loc[rows, columns].
Começar com um índice significativo
O arquivo de pedidos tem seis linhas com identificadores de 1001 a 1006. Crie orders_by_id = orders.set_index("order_id"). Suas colunas, em ordem, são date, product, category, quantity e unit_price. Os rótulos das linhas são números de pedidos, não as posições de 0 a 5.
orders_by_id.loc[1003]
orders_by_id.loc[1004, "product"]
A primeira expressão retorna o pedido 1003 como uma Series: date "2026-03-03", product "Pen set", category "Stationery", quantity 2,0 e preço 4,75. A Series tem o nome 1003. A segunda retorna uma célula, "Mug".
Um rótulo ausente gera KeyError. orders_by_id.loc[0] falha: ter uma primeira linha na posição 0 não cria um rótulo 0.
Selecionar conjuntos de rótulos
orders_by_id.loc[[1001, 1005], ["product", "unit_price"]]
Listas selecionam rótulos na ordem solicitada. Isso produz duas linhas e duas colunas: Notebook a 2,5, depois Backpack a 35,0. Uma lista mantém um resultado em forma de tabela mesmo quando contém um único rótulo: .loc[[1003]] é um DataFrame de uma linha.
| Solicitação | Forma |
|---|---|
| Um valor | .loc[1004, "product"] |
| Uma linha completa | .loc[1004] |
| Uma tabela de uma linha | .loc[[1004]] |
| Todas as linhas, uma coluna | .loc[:, "unit_price"] |
Dois-pontos isolados significam todos os rótulos ao longo desse eixo. Omitir o seletor de colunas também solicita todas as colunas.
Incluir os dois extremos de uma fatia por rótulos
orders_by_id.loc[1002:1004, "product":"quantity"]
Nesse índice ordenado, as linhas são 1002, 1003 e 1004. A fatia de colunas inclui product, category e quantity. Tanto o rótulo final das linhas quanto o das colunas são incluídos, então a forma é (3, 3). Aplicar aqui a regra usual do Python que exclui o extremo final omitiria uma linha e uma coluna desejadas.
Os rótulos permanecem após a ordenação
Um índice padrão pode ocultar a distinção entre rótulo e posição. Suponha que a ordenação de notas produza os rótulos de linha 3, 0, 2, 1, 4. .loc[0] continua selecionando o rótulo 0, agora na segunda linha exibida. .iloc[0] seleciona a primeira linha exibida, com rótulo 3. A ordenação move uma linha com seu rótulo; ela não renumera o índice silenciosamente.
Combinar uma condição com a seleção de colunas
O seletor de linhas pode ser uma Series booleana:
orders.loc[orders["unit_price"] > 5, ["product", "unit_price"]]
Isso mantém Desk lamp a 18,0, Mug a 6,0 e Backpack a 35,0, e retorna apenas as duas colunas solicitadas. A máscara decide quais linhas atendem à condição; a lista de colunas decide o que mostrar. A mesma forma com dois eixos pode selecionar células para atualização, colocando a seleção no lado esquerdo de uma atribuição.
Principais conclusões
locseleciona rótulos de linhas e nomes de colunas.- Listas solicitam rótulos na ordem em que são listados e preservam a dimensão do DataFrame nesse eixo.
- Fatias por rótulos incluem o rótulo final; dois-pontos selecionam todos os rótulos.
- Rótulos solicitados que não existem geram
KeyError. - A ordenação move os rótulos com as linhas, então o rótulo 0 pode diferir da posição 0.
- Uma máscara booleana de linhas e nomes de colunas podem ser usados na mesma chamada de
loc.
3.2 Selecionar por posição com iloc e escolher o indexador adequado
Use iloc quando uma solicitação disser respeito à posição de uma linha ou coluna: as primeiras três linhas, a última coluna ou uma célula específica exibida. Seus seletores são posições inteiras, independentemente dos rótulos do índice.
Contar a partir de zero
orders.iloc[0] seleciona a primeira linha e orders.iloc[-1], a última. Uma posição negativa conta de trás para a frente. Duas posições selecionam uma célula: orders.iloc[2, 2] é "Pen set" na tabela original de pedidos, em que product está na posição de coluna 2.
A tabela indexada orders_by_id tem as colunas date, product, category, quantity e unit_price. Mover order_id para o índice alterou as posições das colunas, então product agora está na posição 1. O código baseado em posições depende dessa estrutura.
Parar antes do extremo final da fatia
orders_by_id.iloc[1:3, 0:2]
As posições de linha selecionadas são 1 e 2, que contêm os pedidos 1002 e 1003. As posições de coluna são 0 e 1, date e product. A posição 3 e a coluna 2 são excluídas, produzindo a forma (2, 2). Um início vazio significa o começo; um fim vazio significa o fim.
Listas solicitam posições específicas, incluindo uma mistura de posições positivas e negativas. orders.iloc[[0, -1], [2, 5]] seleciona product e unit_price para o primeiro e o último pedido. Ambos são Notebook a 2,5.
Prever a forma do resultado
| Seleção | Resultado |
|---|---|
orders.iloc[0, 2] | Um valor |
orders.iloc[0] | Uma Series de uma linha |
orders.iloc[:, 2] | Uma Series de uma coluna |
orders.iloc[[0]] | Um DataFrame de uma linha |
orders.iloc[0:1, 2:3] | Um DataFrame de uma linha e uma coluna |
Um escalar seleciona um item ao longo de um eixo e remove essa dimensão. Uma fatia ou lista mantém esse eixo, mesmo que selecione apenas um item. Isso importa quando a próxima operação espera uma tabela em vez de uma Series.
Tratar o fim de uma tabela
A tabela de pedidos de seis linhas tem posições de linha não negativas válidas de 0 a 5. orders.iloc[10] gera IndexError. Uma fatia pode ultrapassar a tabela: orders.iloc[4:100] simplesmente retorna as duas últimas linhas. Uma única posição inexistente é uma solicitação de item inválida, enquanto uma fatia descreve um intervalo limitado às linhas disponíveis.
Escolher rótulos ou posições de forma consciente
Para uma única célula, at usa rótulos e iat usa posições. orders.at[2, "product"] e orders.iat[2, 2] produzem "Pen set" antes de as linhas serem reordenadas.
Escolha loc quando souber um identificador ou o significado de uma coluna. Escolha iloc quando a própria localização importar. Para combinar as primeiras linhas com um nome de coluna, orders.columns.get_loc("quantity") retorna sua posição, 4, permitindo orders.iloc[0:3, 4].
Colchetes isolados podem mudar de função: orders["product"] seleciona uma coluna, mas orders[2:4] seleciona as posições de linha 2 e 3. Usar loc e iloc explicitamente torna essa escolha mais fácil de entender.
Principais conclusões
ilocusa posições inteiras começando em zero; posições negativas contam a partir do fim.- Fatias por posições excluem seu extremo final e podem ultrapassar as linhas disponíveis.
- Uma única posição fora do intervalo gera
IndexError. - Seletores escalares removem uma dimensão; listas e fatias a mantêm.
atseleciona uma célula por rótulo eiatseleciona uma célula por posição.
4Filtrar linhas por condições
Condições permitem concentrar-se em observações que respondem a uma pergunta. Construa máscaras a partir de comparações, combine-as e use métodos auxiliares para categorias, intervalos, lacunas e correspondências de texto. Depois, direcione uma atualização à tabela original com uma atribuição usando loc. Filtragem e atualização compartilham uma condição de linha, mas acompanhar qual tabela recebe uma alteração é essencial sob a cópia na escrita do pandas 3.
4.1 Filtrar com máscaras booleanas
A filtragem seleciona observações que satisfazem uma pergunta, como quais pedidos pertencem a Home e custam mais de 10 por item. Primeiro, crie uma máscara booleana, uma Series com um True ou False por linha. Depois, use-a para selecionar as linhas correspondentes.
Construir e aplicar uma máscara
is_stationery = orders["category"] == "Stationery"
stationery = orders[is_stationery]
A máscara é True, False, True, False, False e True. A seleção mantém os rótulos 0, 2 e 5, correspondentes aos pedidos 1001, 1003 e 1006. A filtragem preserva esses rótulos; ela não os renumera. reset_index(drop=True) fornece rótulos consecutivos se necessário.
Os operadores de comparação incluem ==, !=, <, <=, > e >=. Comparações de texto exigem correspondência exata: "home" difere de "Home", e espaços também podem impedir uma correspondência.
Combinar condições linha por linha
is_home = orders["category"] == "Home"
is_expensive = orders["unit_price"] > 10
orders[is_home & is_expensive]
Apenas Desk lamp atende às condições: sua categoria é Home e seu preço é 18,0. Mug é da categoria Home, mas custa 6,0. Backpack custa 35,0, mas pertence a Bags.
Ao escrever comparações diretamente, coloque cada uma entre parênteses:
orders[(orders["category"] == "Home") &
(orders["unit_price"] > 10)]
Use & para e, | para ou e ~ para não. Os parênteses mantêm cada comparação agrupada antes de o pandas combinar as máscaras. Sem eles, as regras de precedência do Python podem tentar combinar uma string e uma Series com & e gerar TypeError.
Os operadores and, or e not do Python esperam um único valor lógico, não uma coluna de valores lógicos. Usá-los em máscaras gera o ValueError de valor lógico ambíguo. Um simples if orders["quantity"] > 1: tem o mesmo problema. Use .any() para perguntar se alguma linha corresponde ou .all() para perguntar se todas correspondem.
Contar correspondências e proporções
is_stationery.sum() é 3 porque True conta como 1 e False como 0. is_stationery.mean() é 0,5, a fração dos seis pedidos que correspondem à condição. Multiplique por 100 para expressá-la como 50%.
Tratar valores ausentes explicitamente
Com a coluna original de quantidade float64, comparações que envolvem NaN produzem False, exceto !=, que produz True. quantity >= 1 mantém cinco linhas; quantity < 1 não mantém nenhuma. A quantidade em branco não está em nenhuma das seleções. Ainda assim, quantity != 3 inclui essa linha em branco, então ser diferente não significa ser conhecido e diferente.
Após a conversão para Int64 com suporte a valores ausentes, a comparação com <NA> produz <NA>, e a filtragem exclui essas linhas. Use isna() ou notna() quando a pergunta disser respeito a lacunas.
Para selecionar colunas além de linhas, use orders.loc[is_home, "product"]. Ele retorna Desk lamp e Mug. Uma máscara nomeada pode ser reutilizada para inspecionar, contar e atualizar o mesmo conjunto de linhas.
Principais conclusões
- Uma comparação cria um resultado booleano por linha; a filtragem mantém as linhas True e preserva os rótulos.
- Combine máscaras com
&,|e~, usando parênteses ao redor das comparações. - Use
.any()ou.all()quando for necessário um único valor lógico. - A soma de uma máscara booleana conta as correspondências, e sua média fornece a proporção delas.
- Verifique lacunas explicitamente: o NaN de ponto flutuante e o
<NA>de tipos com suporte a valores ausentes se comportam de modo diferente em comparações. - A igualdade entre textos diferencia maiúsculas de minúsculas e considera os espaços.
4.2 Usar métodos auxiliares e query para filtros comuns
Alguns filtros têm formas conhecidas: pertencimento a uma lista, um intervalo numérico, um valor ausente ou um fragmento de texto. Métodos auxiliares expressam esses testes diretamente e ainda produzem máscaras que podem ser combinadas com outras condições.
Testar pertencimento e intervalos
orders[orders["category"].isin(["Home", "Bags"])]
orders[orders["unit_price"].between(4.75, 18)]
isin encontra correspondências com qualquer valor listado. A primeira seleção contém os pedidos 1002, 1004 e 1005. ~orders["category"].isin(["Home"]) inverte o teste de pertencimento e mantém as linhas de Stationery e Bags. Uma expressão in do Python não cria essa máscara de pertencimento linha por linha.
between inclui ambos os extremos por padrão. A segunda seleção inclui Desk lamp a 18,0, Pen set a 4,75 e Mug a 6,0. Use inclusive="neither" para excluir ambos os extremos, "left" para incluir apenas o extremo inferior ou "right" para incluir apenas o extremo superior. Escolha a regra dos extremos de acordo com a pergunta feita.
Encontrar entradas ausentes e presentes
orders[orders["quantity"].isna()] mantém o pedido 1006. notna() faz o contrário, mantendo as quantidades registradas. Não teste igualdade com np.nan: NaN é diferente até de si mesmo, então quantity == np.nan não encontra a linha ausente.
Procurar dentro do texto
orders[orders["product"].str.contains("note", case=False, na=False)]
str.contains testa se cada valor de texto contém uma correspondência. Ignorar maiúsculas e minúsculas encontra ambas as linhas com Notebook. na=False faz com que texto ausente conte como sem correspondência. Por padrão, a busca trata seu padrão como uma expressão regular; para um fragmento de texto literal com pontuação, regex=False evita interpretar essa pontuação como um padrão. str.startswith e str.endswith testam o início e o fim.
Escrever um filtro como consulta
orders.query("quantity >= 2 and unit_price < 5")
Isso mantém os pedidos 1001 e 1003. Dentro de uma string de query, nomes de colunas representam colunas e and, or e not são permitidos. A string é uma expressão de consulta do pandas; sua sintaxe difere daquela usada para combinar Series diretamente no Python comum.
Uma variável Python precisa de @:
limit = 5
orders.query("unit_price > @limit")
O resultado contém Desk lamp, Mug e Backpack. Um nome de coluna que contém espaço precisa ficar entre crases dentro da consulta, como em orders.query("`unit price` > 5").
A mesma pergunta pode ser escrita como uma máscara, uma chamada de método auxiliar ou uma consulta. Prefira a forma que exponha a regra com clareza. Para um intervalo, between reúne os limites e a regra de inclusão. Para um conjunto de rótulos permitidos, isin evita repetir testes de igualdade. Quando um filtro se comportar de modo inesperado, inspecione a máscara e os valores exatos da coluna antes de alterar a condição.
Principais conclusões
isintesta pertencimento e~inverte a máscara.betweeninclui ambos os extremos, a menos queinclusivealtere a regra.isnaenotnadetectam lacunas e valores registrados.str.containsprocura texto;case=Falseignora maiúsculas e minúsculas ena=Falseexclui texto ausente.- Dentro de
query, as colunas são nomeadas diretamente, variáveis Python usam@e nomes de colunas com espaços usam crases.
4.3 Alterar valores nas linhas selecionadas com segurança
Uma atualização precisa ter como alvo a tabela que você pretende alterar. No pandas 3, uma seleção se comporta como um objeto separado sob a cópia na escrita, então alterar um objeto selecionado não altera sua tabela de origem.
Colocar todo o alvo em uma atribuição com loc
sale = orders.copy()
is_home = sale["category"] == "Home"
sale.loc[is_home, "unit_price"] *= 0.9
A máscara seleciona duas linhas de Home. O seletor de coluna direciona a operação aos seus preços. A multiplicação por 0,9 mantém 90% de cada preço, reduzindo 18,00 para 16,20 e 6,00 para 5,40. As outras linhas não são alteradas. A forma expandida lê a mesma seleção no lado direito e atribui seus valores multiplicados no lado esquerdo.
Aqui, sale é uma tabela separada usada para uma alteração de preços, deixando orders disponível para comparação. Para atualizar a tabela original, coloque o próprio orders.loc[...] no lado esquerdo da atribuição.
Evitar atribuição encadeada
orders[orders["category"] == "Home"]["unit_price"] = 0
Isso usa duas etapas de indexação. A primeira produz um objeto selecionado; a segunda atribui valores a esse objeto. No pandas 3, isso nunca atualiza orders, e um aviso ChainedAssignmentError aponta o problema. A mesma questão afeta orders["unit_price"][1] = 0.
Use orders.loc[orders["category"] == "Home", "unit_price"] = 0 quando a alteração desejada for na tabela original. A tabela, as linhas correspondentes e a coluna são especificadas em uma única atribuição.
Entender tabelas selecionadas
Após home = orders[orders["category"] == "Home"], alterar home["unit_price"] altera apenas home. Alterações posteriores em orders também não alteram home. Os objetos podem compartilhar armazenamento internamente até que uma gravação seja necessária, mas seus valores visíveis se comportam de forma independente.
Exemplos mais antigos de pandas podem mostrar SettingWithCopyWarning e usar .copy() após a seleção para evitar atualizações incertas. O pandas 3 removeu esse aviso e tornou consistente a independência das seleções. Um .copy() explícito ainda é útil para declarar a intenção, mas uma seleção já se comporta de forma independente nas atualizações.
Associar os valores do lado direito ao alvo
Um escalar preenche todas as células selecionadas. Uma lista precisa de exatamente um valor por linha selecionada e as preenche na ordem da seleção. Uma Series se alinha pelo rótulo do índice:
new_prices = pd.Series([16.2, 5.4], index=[1, 3])
sale.loc[is_home, "unit_price"] = new_prices
As linhas de Home têm os rótulos 1 e 3, então recebem 16,2 e 5,4. Se um rótulo selecionado estivesse ausente da Series, seu valor atribuído seria NaN; linhas fora da seleção permaneceriam inalteradas. Comprimentos iguais, por si só, não estabelecem uma correspondência entre a Series e as linhas.
Inspecione sale.loc[is_home, "unit_price"] após a alteração e compare-o com orders.loc[is_home, "unit_price"]. O .sum() da máscara é 2, o que fornece o número esperado de linhas selecionadas para esse desconto.
Principais conclusões
- Atualize a tabela desejada por meio de uma única atribuição
loc[mask, column]. - No pandas 3, a atribuição encadeada nunca atualiza a tabela original.
- Seleções se comportam de forma independente sob a cópia na escrita.
- Um escalar preenche a seleção; uma lista segue a ordem; uma Series se alinha por rótulo.
5Adicionar e transformar colunas
Colunas derivadas expressam relações já presentes em uma tabela: quantidade e preço se tornam receita, enquanto uma condição se torna um rótulo de categoria. Use aritmética vetorizada e pequenas transformações para declarar essas regras com clareza. Você também escolherá entre mapear todos os valores e substituir alguns, manterá resultados por atribuição e considerará entradas ausentes e alinhamento por rótulos quando novos valores entrarem em uma tabela.
5.1 Calcular novas colunas a partir das existentes
Novas colunas transformam dados registrados em quantidades que você pode analisar. Um cálculo entre colunas funciona linha por linha, enquanto o índice mantém cada resultado ligado à sua observação.
Calcular receita
orders["revenue"] = orders["quantity"] * orders["unit_price"]
As seis receitas são 7,5; 18,0; 9,5; 24,0; 35,0 e NaN. Para a primeira linha, três itens a 2,50 cada produzem 7,50. A última linha tem uma quantidade desconhecida, então sua receita também é desconhecida. Atribuir a um novo nome adiciona uma coluna à direita; atribuir a um nome existente sobrescreve essa coluna.
A aritmética entre colunas é vetorizada. Ela expressa uma regra para a coluna inteira e evita um laço Python sobre as linhas. Em tabelas grandes, isso é muito mais rápido que for ou iterrows, e a expressão torna clara a relação entre as entradas.
Usar os valores registrados em um total
orders["revenue"].sum() ignora NaN e produz 94,0, o total das cinco receitas conhecidas. .mean() produz 18,8 porque o denominador é de cinco receitas registradas. Dividir 94,0 pelas seis linhas trataria silenciosamente a receita ausente como se ela contribuísse com um zero conhecido.
Para calcular as participações percentuais:
orders["share_pct"] = (
orders["revenue"] / orders["revenue"].sum() * 100
).round(1)
As participações são 8,0; 19,1; 10,1; 25,5; 37,2 e NaN. Essas são participações no total conhecido. A entrada ausente permanece ausente ao longo da aritmética.
Retornar uma tabela com assign
assign retorna um novo DataFrame com colunas adicionadas ou substituídas, deixando sua entrada inalterada. Ele funciona naturalmente em uma sequência de métodos:
with_tax = orders.assign(
tax=lambda d: (d["revenue"] * 0.2).round(2)
)
A lambda lê a tabela naquele ponto da sequência. Ela produz valores de imposto de 1,5; 3,6; 1,9; 4,8; 7,0 e NaN. No pandas 3, pd.col("revenue") * 0.2 é outra maneira de se referir a uma coluna em assign.
Cálculos decimais podem revelar pequenos erros de representação binária de ponto flutuante: 9,5 vezes 0,2 pode ser armazenado como 1.9000000000000001. .round(2) fornece um valor útil para apresentação. Evite testes de igualdade exata em decimais calculados quando pequenos erros de representação forem possíveis.
Saber como a atribuição associa linhas
orders["home_price"] = orders.loc[
orders["category"] == "Home", "unit_price"
]
A Series atribuída tem os rótulos 1 e 3. Essas linhas recebem 18,0 e 6,0; todas as outras recebem NaN. A atribuição de uma Series associa rótulos, mesmo quando seu comprimento difere do da tabela. Uma lista comum não tem rótulos e deve conter exatamente um valor por linha. Um escalar, como orders["currency"] = "EUR", preenche todas as linhas.
Derivar valores de texto ou datas
Os acessores .str e .dt também fornecem operações vetorizadas em colunas. orders["product"].str.upper() produz nomes em maiúsculas, e .str.len() fornece comprimentos 8, 9, 7, 3, 8 e 8. Atribua esses resultados a uma nova coluna quando tanto os valores originais quanto os derivados forem úteis.
Principais conclusões
- Atribuir uma expressão de coluna armazena um resultado por linha.
- Entradas desconhecidas geralmente produzem resultados aritméticos desconhecidos; resumos ignoram valores ausentes por padrão.
- Operações vetorizadas em colunas evitam laços sobre linhas.
assignretorna um novo DataFrame e pode se referir a colunas por meio de uma lambda.- A atribuição de Series associa rótulos; a atribuição de lista segue a ordem e o comprimento das linhas.
- Use
.stre.dtpara colunas derivadas de texto e datas.
5.2 Recodificar e transformar valores com np.where, map e apply
Transformar uma coluna pode significar aplicar uma regra numérica, atribuir um rótulo ou traduzir rótulos existentes. Escolha um método cujo comportamento corresponda à regra, especialmente para valores que ela não menciona.
Transformar uma condição em rótulos
orders["price_band"] = np.where(
orders["unit_price"] >= 5, "high", "low"
)
np.where escolhe seu segundo argumento quando a condição é True e seu terceiro quando ela é False. Para os preços 2,50; 18,00; 4,75; 6,00; 35,00 e 2,50, os rótulos são low, high, low, high, high e low. O >= inclui um preço exatamente igual a 5.
Traduzir todos os valores ou alterar alguns
codes = {"Stationery": "ST", "Home": "HM", "Bags": "BG"}
orders["category_code"] = orders["category"].map(codes)
map com dicionário produz ST, HM, ST, HM, BG e ST. Um valor ausente do dicionário se torna NaN. Com apenas {"Stationery": "ST"}, tanto Home quanto Bags se tornam ausentes. Use um mapeamento completo quando cada categoria precisar de um código traduzido.
replace altera valores listados e deixa os não listados inalterados. orders["category"].replace({"Bags": "Luggage"}) mantém Stationery e Home enquanto renomeia Bags.
| Alteração desejada | Método adequado |
|---|---|
| Dar um código a cada categoria conhecida | map com um dicionário |
| Renomear alguns rótulos existentes | replace |
| Escolher entre duas saídas a partir de uma condição | np.where |
Aplicar uma função personalizada
Uma Series pode passar cada valor a uma função por meio de map ou apply. orders["product"].apply(len) retorna o comprimento do nome de cada produto. Passe o próprio len; len() o chamaria imediatamente sem um valor.
Uma lambda pode expressar uma pequena regra para valores: orders["unit_price"].apply(lambda p: "budget" if p < 5 else "standard"). Isso retorna budget, standard, budget, standard, standard e budget.
Para uma lógica que exige várias células em uma linha, o apply de DataFrame aceita axis=1:
orders.apply(
lambda r: r["quantity"] * r["unit_price"], axis=1
)
A função lê a quantidade e o preço de cada linha. Para essa operação, a multiplicação direta de colunas é mais clara e muito mais rápida em uma tabela grande. Use expressões vetorizadas ou np.where quando puderem expressar o cálculo; reserve funções por linha para lógicas que precisem delas.
Usar transformações numéricas disponíveis
round(n) arredonda para n casas decimais, abs() fornece valores absolutos e clip(lower=..., upper=...) limita valores aos limites informados. orders["unit_price"].clip(upper=20) altera 35,0 para 20,0 e deixa os outros cinco preços inalterados. Ele não remove a linha de preço alto.
Essas transformações retornam novos valores. Atribua-os a uma nova coluna para preservar a entrada para verificação ou sobrescreva a original quando essa for a intenção. Inspecione algumas linhas transformadas ou execute value_counts() para verificar se os novos rótulos e suas contagens correspondem à regra.
Principais conclusões
np.whereseleciona uma saída para o caso verdadeiro ou falso de cada valor da condição.mapcom dicionário torna ausentes os valores não listados;replaceos mantém.- Passe a própria função a
apply; useaxis=1para uma função aplicada às linhas de um DataFrame. - Prefira operações vetorizadas quando expressarem a regra.
cliplimita valores, enquantoroundeabsos transformam sem selecionar linhas.
6Ordenar dados, atribuir postos e resumir dados
Uma tabela ordenada e um resumo estatístico compacto respondem a perguntas diferentes sobre as mesmas observações. Ordene registros, atribua postos com uma regra deliberada para empates e escolha contagens, medidas de tendência central ou de dispersão adequadas aos dados. Depois, examine proporções de categorias e relações numéricas. Valores ausentes, direção da classificação, denominadores amostrais e limites da correlação afetam a interpretação de um resultado.
6.1 Ordenar linhas por valores ou pelo índice
Ordenar altera a ordem em que as observações aparecem. A operação mantém juntos os valores de cada linha e leva consigo o rótulo da linha. Decida o que tem prioridade e como valores empatados devem ser ordenados antes de selecionar os maiores ou menores.
Ordenar uma coluna
scores = pd.DataFrame({
"name": ["Ana", "Ben", "Chen", "Dara", "Eli"],
"points": [88, 92, 88, 75, 92]
})
ordered = scores.sort_values("points")
Por padrão, o menor vem primeiro. Os 75 de Dara vêm primeiro, seguidos dos dois valores 88 e depois dos dois valores 92. Os rótulos das linhas se movem com os registros. Entre empates, o algoritmo de ordenação padrão não garante a ordem original; os rótulos exibidos podem ser 3, 0, 2, 1, 4, mas não se deve presumir que linhas empatadas mantenham essa ordem.
Use ascending=False para colocar o maior primeiro. sort_values retorna uma tabela, deixando scores inalterado, a menos que seu resultado seja atribuído.
Escolher como resolver empates
scores.sort_values(
["points", "name"], ascending=[False, True]
)
A primeira chave tem prioridade. Os pontos diminuem; os nomes aumentam dentro de pontuações iguais. A ordem é Ben, Eli, Ana, Chen e Dara. Ordenar nomes primeiro responderia a uma pergunta diferente porque tornaria os nomes a chave principal.
Quando empates em uma coluna devem preservar a ordem de entrada, use scores.sort_values("points", kind="stable"). A estabilidade mantém as linhas empatadas em sua sequência atual. Uma chave secundária, por sua vez, dá aos empates uma regra explícita de ordenação.
Posicionar valores ausentes e texto
Valores ausentes vão para o fim por padrão, tanto na ordenação crescente quanto na decrescente. pd.Series([3.0, np.nan, 1.0]).sort_values() produz 1,0; 3,0 e depois NaN. na_position="first" move a entrada ausente para o início; inverter apenas a direção da ordenação não faz isso.
A ordenação de texto segue os códigos dos caracteres. "Zebra" vem antes de "apple" porque letras maiúsculas e minúsculas ocupam intervalos diferentes. Nomes escritos de forma consistente, como Bags, Home e Stationery, são ordenados na ordem alfabética esperada.
Ordenar rótulos ou renumerá-los
sort_index() ordena os rótulos das linhas, não os valores dos dados. Após ordenar por pontos, ele pode restaurar a ordem original dos rótulos padrão. sort_index(ascending=False) inverte a ordem dos rótulos. Já reset_index(drop=True) mantém a ordem atual das linhas e substitui seus rótulos por 0, 1, 2 e assim por diante.
Selecionar as linhas com maiores ou menores valores
scores.nlargest(2, "points") retorna Ben e Eli, ambos com 92. nsmallest seleciona valores baixos. Se o corte ocorrer em um empate, decida se deseja manter todas as linhas empatadas. scores.nlargest(1, "points", keep="all") retorna os dois valores 92, embora n seja 1. O número solicitado é então um ponto de corte, não uma garantia sobre a contagem final de linhas.
Principais conclusões
sort_valuesordena linhas pelos valores dos dados;sort_indexordena rótulos de linhas.ascending=Falsecoloca valores altos primeiro, enquanto valores ausentes ainda vão para o fim por padrão.- Várias chaves de ordenação são aplicadas em ordem de prioridade e podem usar direções diferentes.
- Use uma chave secundária ou uma ordenação estável de uma coluna quando a ordem dos empates importar.
reset_index(drop=True)renumera a ordem atual sem ordená-la novamente.keep="all"em uma seleção dos maiores valores pode retornar mais de n linhas.
6.2 Atribuir postos aos valores e tratar empates
Um posto registra a posição de um valor na ordem classificada sem mover sua linha. Isso é útil quando cada observação precisa de um número de posição junto aos dados originais. Empates precisam de uma regra porque vários valores podem ocupar a mesma parte dessa ordem.
Escolher a direção
scores["points"].rank() atribui postos do menor para o maior. Use ascending=False para uma tabela de resultados em que pontuações altas devem receber os melhores postos. O método para empates decide então qual número de posição cada grupo empatado recebe.
As pontuações do exemplo na ordem das linhas são Ana 88, Ben 92, Chen 88, Dara 75 e Eli 92. Em ordem decrescente, os valores 92 ocupam as posições 1 e 2, os valores 88 ocupam as posições 3 e 4, e 75 ocupa a posição 5. O padrão method="average" atribui a cada valor empatado a média das posições que ele ocupa. Os valores retornados, na ordem original das linhas, são 3,5; 1,5; 3,5; 5,0 e 1,5.
Escolher um método para empates
| Método | Postos decrescentes na ordem original das linhas | Regra para empates |
|---|---|---|
average | 3,5; 1,5; 3,5; 5,0; 1,5 | Média dos postos ocupados |
min | 3, 1, 3, 5, 1 | Menor posto ocupado |
max | 4, 2, 4, 5, 2 | Maior posto ocupado |
dense | 2, 1, 2, 3, 1 | Um posto por valor distinto, sem lacunas |
first | 3, 1, 4, 5, 2 | Postos separados na ordem de ocorrência |
Com min, dois vencedores no posto 1 significam que a próxima pontuação começa no posto 3. Com dense, a próxima pontuação distinta começa no posto 2. first desempata mesmo quando as próprias pontuações não fornecem motivo para preferir uma pessoa; ele segue a ordem de entrada.
Os resultados dos postos são números de ponto flutuante, permitindo valores como 1,5. Quando o método escolhido para empates fornece postos inteiros e nenhum está ausente, .astype(int) os converte para exibição. Um tipo inteiro comum não pode armazenar um posto ausente.
Expressar postos como frações
Para o método padrão da média e valores não ausentes, rank(pct=True) divide cada posto pelo número de valores classificados. Classificar as cinco pontuações do exemplo em ordem crescente produz 2,5; 4,5; 2,5; 1,0 e 4,5. Dividir por cinco produz 0,5; 0,9; 0,5; 0,2 e 0,9.
Os maiores valores empatados recebem 0,9, não 1, porque seu posto médio é 4,5. Um posto percentílico descreve a posição relativa aos valores classificados; ele não é uma porcentagem da própria pontuação.
Tratar postos ausentes e armazenar resultados
Valores ausentes mantêm postos NaN por padrão. Com as receitas 7,5; 18,0; 9,5; 24,0; 35,0 e NaN, os postos decrescentes são 5, 3, 4, 2, 1 e NaN. na_option="bottom" coloca a entrada ausente após os valores registrados, atribuindo-lhe o posto 6.
scores["place"] = scores["points"].rank(
method="min", ascending=False
)
As linhas permanecem Ana, Ben, Chen, Dara e Eli. A nova coluna de posição registra 3, 1, 3, 5 e 1. Ordene separadamente se a exibição deve mostrar os vencedores primeiro.
Principais conclusões
- A atribuição de postos define posições sem mover linhas; a classificação decrescente dá números de posto baixos a valores altos.
- Métodos para empates controlam se postos compartilhados deixam lacunas ou seguem a ordem de entrada.
- O método padrão da média pode retornar postos fracionários.
- Com o método padrão da média,
pct=Truedivide pelo número de valores classificados. - Valores ausentes mantêm postos ausentes por padrão;
na_option="bottom"coloca-os por último.
6.3 Resumir colunas com estatísticas descritivas
Uma estatística descritiva resume muitas observações em uma quantidade útil. Escolha uma estatística adequada à pergunta e leia sua contagem de valores não ausentes para saber quantos dados a sustentam.
Calcular medidas de tendência central e dispersão
weather = pd.DataFrame({
"temp_c": [14.0, 17.5, 16.0, 21.0, 19.5, 12.5, 15.0],
"rain_mm": [0.0, 2.4, 0.0, 0.0, 5.1, 12.3, 0.8]
}, index=["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"])
Para weather["temp_c"], sum() é 115,5, mean() é 16,5 e median() é 16,0. O mínimo é 12,5 e o máximo é 21,0, produzindo uma amplitude de 8,5 °C. idxmax() retorna o rótulo "Thu", enquanto idxmin() retorna "Sat": eles identificam observações em vez de retornar os próprios valores extremos.
std() e var() medem a dispersão. O pandas usa o denominador amostral por padrão, ddof=1, dividindo os desvios quadráticos por um a menos que a contagem. Aqui o desvio padrão é aproximadamente 3,028 °C e a variância é aproximadamente 9,167 graus Celsius quadrados. std(ddof=0) usa a própria contagem e produz aproximadamente 2,803 °C. A função np.std do NumPy usa ddof=0 por padrão, então iguale a configuração antes de comparar resultados.
Ler quartis e describe
quantile(0.25) fornece o quartil inferior, 14,5; quantile(0.5) fornece a mediana, 16,0; quantile(0.75) fornece o quartil superior, 18,5. A interpolação padrão pode retornar um valor entre medições registradas.
weather.describe() combina contagem, média, desvio padrão, mínimo, os três quartis e máximo para colunas numéricas. A chuva tem média de aproximadamente 2,94 mm e mediana de 0,8 mm. A medição de 12,3 mm eleva a média; a mediana descreve melhor um dia típico nessa semana com assimetria à direita.
Considerar valores ausentes e tipos
Para pd.Series([1, np.nan, 3]), .mean() é 2,0 porque valores ausentes são ignorados por padrão. .count() é 2, enquanto .size é 3. Com skipna=False, a média é NaN. Não use a contagem total de linhas como denominador para a média padrão quando algumas entradas estiverem ausentes.
Resumos de texto são diferentes. orders["category"].describe() produz count 6, unique 3, top Stationery e freq 3. Calcular a média da tabela de pedidos com texto misturado gera TypeError; use orders.mean(numeric_only=True) ou selecione colunas numéricas com select_dtypes("number").
Resumir ao longo de um eixo
Por padrão, estatísticas de DataFrame reduzem ao longo das linhas para um resultado por coluna. axis=1 fornece um resultado por linha; selecione quantidades cujas unidades possam ser combinadas de modo sensato.
orders[["quantity", "unit_price"]].agg(["mean", "max"])
agg calcula várias estatísticas nomeadas em conjunto. Quantity tem média 2,2 e máximo 4,0; unit_price tem média de aproximadamente 11,46 e máximo 35,0. weather["rain_mm"].cumsum() fornece os totais acumulados 0,0; 2,4; 2,4; 2,4; 7,5; 19,8 e 20,6 mm, preservando um resultado por dia.
Principais conclusões
- Escolha totais, medidas de tendência central ou de dispersão adequados à pergunta.
describereúne estatísticas numéricas comuns; colunas de texto têm resumos baseados em frequência.countexclui valores ausentes, enquantosizeos inclui.- O desvio padrão do pandas usa
ddof=1; o NumPy usaddof=0por padrão. - Quantis podem interpolar entre medições.
idxmaxeidxminretornam rótulos;cumsumretorna totais acumulados.aggsolicita várias estatísticas, eaxiscontrola a direção da redução.
6.4 Contar valores e medir relações
Contagens descrevem quantas vezes valores ocorrem; correlações descrevem como duas variáveis numéricas variam em conjunto. Ambos os resumos precisam de interpretação: o que está sendo contado, o que está ausente e qual relação a estatística mede.
Contar categorias ou listar valores distintos
orders["category"].value_counts() produz Stationery 3, Home 2 e Bags 1, ordenados por frequência. A Series retornada se chama count. Entradas ausentes são excluídas por padrão; dropna=False as inclui como uma contagem separada.
orders["category"].value_counts(normalize=True)
A Series normalizada se chama proportion: Stationery é 0,5, Home é aproximadamente 0,333 e Bags é aproximadamente 0,167. Multiplicar por 100 expressa porcentagens. Com a regra padrão para valores ausentes, essas proporções descrevem os valores presentes.
| Pergunta | Método |
|---|---|
| Quantas vezes cada valor ocorre? | value_counts() |
| Quais valores distintos ocorrem? | unique() |
| Quantos valores presentes distintos ocorrem? | nunique() |
| Qual valor ou quais valores ocorrem com maior frequência? | mode() |
unique() mantém a ordem da primeira ocorrência: Stationery, Home, Bags. mode() retorna uma Series porque vários valores podem empatar pela maior frequência. Ele não solicita um único vencedor escolhido arbitrariamente.
Condições podem ser contadas diretamente. (weather["rain_mm"] > 0).sum() conta quatro dias chuvosos. Seu .mean() é aproximadamente 0,571, então cerca de 57% dos sete dias tiveram chuva.
Medir uma relação linear
weather["temp_c"].corr(weather["rain_mm"]) fornece uma correlação de Pearson de aproximadamente −0,397. Seu sinal negativo indica que dias mais quentes tenderam a ter menos chuva nessas observações. Sua magnitude descreve quão bem um padrão linear se ajusta aos dados, em uma escala de −1, passando por 0, até 1.
Um valor de 1 significa uma relação linear crescente perfeita; −1 significa uma relação decrescente perfeita. Um valor próximo de zero significa pouca associação linear. Uma relação curva ainda pode ser forte mesmo quando a correlação de Pearson está próxima de zero. Correlação também diz respeito à associação, não é evidência de que alterar uma variável cause a alteração da outra.
Ler uma matriz de correlação
weather.corr() fornece todos os pares numéricos em conjunto. A matriz é simétrica: temperatura com chuva tem a mesma correlação que chuva com temperatura. Uma coluna numérica que varia tem correlação 1 consigo mesma; uma coluna constante não tem correlação definida e produz NaN.
Para relações que aumentam ou diminuem consistentemente sem seguir uma linha reta, method="spearman" calcula a correlação a partir dos postos. O método altera o tipo de padrão resumido, então informe-o ao relatar um resultado.
O cálculo meteorológico usa apenas sete medições. Ele descreve essa pequena semana observada; afirmações fortes sobre um padrão climático mais amplo precisam de mais evidências. Um relatório útil inclui as variáveis, o sinal e o tamanho do coeficiente, o método e o número de observações.
Principais conclusões
value_countsapresenta frequências; a normalização apresenta proporções dos valores contados.unique,nuniqueemoderespondem a perguntas diferentes sobre valores distintos e frequentes.- A soma de uma condição conta correspondências, e sua média fornece uma proporção.
- A correlação de Pearson mede associação linear de −1 a 1.
- Uma matriz de correlação é simétrica; colunas constantes produzem correlações indefinidas.
- A correlação de Spearman opera sobre postos, e a correlação sozinha não estabelece causa.
Exercícios resolvidos de Series e DataFrames no pandas
1Construir uma tabela com rótulos significativos
12 passos
- 1IntroduçãoManter valores ligados ao seu significado
Uma lista fornece valores em uma ordem. O pandas adiciona rótulos para que você possa identificar o que cada valor descreve, mesmo depois que as linhas se movem. Comece com uma variável com rótulos, depois combine várias variáveis em uma tabela.
A pergunta principal é se uma operação segue a identidade de uma linha ou sua posição atual. Essa distinção explica tanto a aritmética de Series quanto a escolha de um índice útil para uma tabela.
- 2ExemploConstruir uma Series de chuva com rótulos
Crie três medições de chuva em milímetros:
rain = pd.Series([4.5, 3.0, 6.2], index=["Mon", "Tue", "Wed"], name="rain_mm")Os valores e rótulos são pareados em ordem.
rain["Tue"]fornece 3,0, enquantorain.iloc[0]fornece 4,5. A primeira solicitação nomeia um dia; a segunda nomeia uma posição..dtypeéfloat64, e.sizeé 3. - 3ExplicaçãoAplicar uma regra a cada valor
Uma Series permite operações vetorizadas:
rain * 2dobra cada medição e mantém os rótulos dos dias.rain > 4produz True, False e True, novamente com rótulos por dia.Use atributos como
.index,.namee.dtypesem parênteses. Quando precisar dos valores como um array do NumPy, chame.to_numpy();.valuespode retornar um array do pandas para alguns tipos de dados. - 4ExemploSomar por rótulo, não pela linha exibida
Suponha que a contenha x 1, y 2 e z 3, enquanto b contém y 10, z 20 e w 30. Em
a + b, y é pareado com y, produzindo 12,0, e z é pareado com z, produzindo 23,0.Os rótulos x e w não têm correspondência, então seus resultados são NaN.
a.add(b, fill_value=0)fornece x 1,0 e w 30,0. Uma posição de linha compartilhada não associa entradas com rótulos diferentes. - 5DesafioPrever uma soma alinhada
Uma Series tem os rótulos a e b com valores 4 e 7. Outra tem os rótulos b e c com valores 3 e 9. Quais são os resultados não ausentes da adição comum?
---reveal---
Apenas b está presente em ambas as entradas. Sua soma é 7 mais 3, produzindo 10,0. Os rótulos a e c têm resultados ausentes. Somar o primeiro ao primeiro associaria incorretamente a a b.
- 6ExemploConstruir várias variáveis em colunas
Crie uma pequena tabela de pedidos:
df = pd.DataFrame({"product": ["Notebook", "Mug"], "quantity": [3, 4], "unit_price": [2.5, 6.0]})Cada lista fornece uma coluna e deve ter um valor por linha. As colunas compartilham os rótulos de índice 0 e 1, mas mantêm seus próprios tipos de dados.
.shapeé(2, 3), enquanto.sizeé 6 porque conta cada célula. - 7Ideia-chaveManter a forma necessária à próxima etapa
df["quantity"]retorna uma Series.df[["quantity"]]retorna um DataFrame de uma coluna porque a lista interna solicita uma coleção de colunas.Essa é uma diferença de estrutura, embora os valores visíveis sejam iguais. Colchetes também evitam conflitos de nomes: uma coluna chamada size precisa de
df["size"], poisdf.sizesignifica a contagem de células do DataFrame. - 8DesafioEscolher a direção de um total
Para as colunas a
[1, 2]e b[3, 4], o que uma soma por linha retorna e qual eixo a solicita?---reveal---
Use
df.sum(axis=1). A primeira linha fornece 1 mais 3, ou 4; a segunda fornece 2 mais 4, ou 6. O eixo padrão opera ao longo das linhas e forneceria, em vez disso, os totais de coluna a 3 e b 7. - 9ExemploUsar o identificador do pedido como índice
Para uma tabela com uma coluna order_id, salve
by_id = orders.set_index("order_id"). Os números de pedido passam para o índice de linhas e saem das colunas comuns.Uma consulta como
by_id.loc[1004]agora identifica um pedido em vez de sua localização atual. Verifiqueby_id.index.is_uniqueantes de depender de cada número para identificar exatamente uma linha; o pandas permite rótulos duplicados. - 10DicaSalvar uma alteração de rótulos
rename,drop,set_indexereset_indexretornam novas tabelas. Mantenha o resultado com uma atribuição, comoorders = orders.rename(columns={"unit_price": "price"}).Uma atribuição omitida deixa a tabela antiga no lugar. Um nome antigo de coluna escrito incorretamente em rename é ignorado por padrão, então inspecione
.columnsquando o novo nome esperado estiver ausente. - 11DesafioRestaurar identificadores sem perdê-los
Uma tabela usa identificadores de pedidos como índice. Você precisa de um índice de linhas padrão e ainda precisa dos identificadores como dados. Qual operação deve salvar?
---reveal---
Salve
df = df.reset_index(). Ele preserva o índice antigo como uma coluna e fornece os rótulos 0, 1, 2 e assim por diante. Usardrop=Truedescartaria esses identificadores. A ordem das linhas permanece a mesma. - 12RecapitulaçãoPrever identidade, tipo e forma
Antes de ler um resultado, verifique três coisas: quais rótulos identificam seus valores, qual tipo de dados os armazena e quantos eixos a seleção mantém.
A aritmética de Series segue os rótulos. Um DataFrame organiza variáveis em colunas com tipos definidos. Alterações de índice permitem que um identificador significativo dê suporte a consultas posteriores, desde que a tabela retornada seja salva e seus rótulos identifiquem as linhas de forma única.
2Carregar um CSV e verificar seu significado
13 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoTratar o carregamento como uma etapa verificável
- 2ExplicaçãoLer registros em uma tabela
- 3ExemploAjustar separadores e marcas decimais
- 4DicaPreservar códigos durante a leitura
- 5DesafioManter o primeiro registro
- 6ExemploVerificar a estrutura visível
- 7ExplicaçãoContar o que está presente e ausente
- 8DesafioVerificar um identificador e uma medição
- 9ExemploConverter texto numérico e investigar uma falha
- 10Ideia-chaveManter contagens ausentes como inteiros
- 11ExemploDisponibilizar operações com datas
- 12DesafioCorrigir uma importação numérica
- 13RecapitulaçãoRelacionar estrutura, tipos e contagens
3Selecionar linhas por identidade ou localização
10 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoPerguntar se importa a identidade ou a localização
- 2ExemploLer um pedido conhecido
- 3ExemploLer um intervalo inclusivo de rótulos
- 4DesafioManter uma tabela de uma linha
- 5ExemploLer um intervalo por posições
- 6DicaLer de trás para a frente e além do fim
- 7DesafioPrever uma linha ou um valor
- 8ConexãoUsar uma forma curta para uma célula
- 9DesafioAcompanhar uma linha durante a ordenação
- 10RecapitulaçãoInformar o seletor e a forma
4Filtrar registros e atualizar a tabela certa
13 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoTransformar uma pergunta sobre dados em um teste de linhas
- 2ExemploConstruir uma máscara booleana
- 3ExplicaçãoExigir ambas as condições
- 4DicaUsar um único valor lógico apenas quando necessário
- 5DesafioContar uma condição combinada
- 6ExemploExpressar um intervalo diretamente
- 7Ideia-chaveEncontrar lacunas com um teste de valor ausente
- 8DesafioTraduzir um filtro para query
- 9ExemploDar desconto exatamente aos preços de Home
- 10ExplicaçãoEntender por que uma cadeia não altera a origem
- 11DicaAssociar valores de atualização por rótulo
- 12DesafioCombinar filtragem e atualização
- 13RecapitulaçãoTornar condições e alvos explícitos
5Transformar colunas existentes em novos dados úteis
12 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoExpressar uma regra para cada coluna
- 2ExemploCalcular uma receita por pedido
- 3Ideia-chaveInterpretar o denominador de uma média
- 4ExemploAdicionar uma coluna em uma sequência de métodos
- 5DesafioPosicionar uma Series recebida
- 6ExemploEscolher rótulos a partir de um limite
- 7ExplicaçãoDecidir o significado de valores não listados
- 8DesafioEscolher um método de recodificação parcial
- 9DicaPassar funções sem chamá-las
- 10ExemploLimitar valores sem remover registros
- 11DesafioAcompanhar uma coluna calculada e recodificada
- 12RecapitulaçãoVerificar a regra e suas entradas sem correspondência
6Ordenar dados e interpretar seus resumos
18 passos
Salve esta aula para seguir cada Lição Interativa passo a passo.
- 1IntroduçãoEscolher a visão que responde à pergunta
- 2ExemploOrdenar pontos antes dos nomes
- 3DicaManter um empate completo no limite
- 4DesafioSeparar a ordem dos rótulos da ordem dos valores
- 5ExemploCalcular a média das posições ocupadas por empates
- 6ExplicaçãoEscolher lacunas ou grupos consecutivos
- 7DesafioInterpretar um posto percentílico
- 8ExemploConstruir um resumo meteorológico
- 9ExplicaçãoIgualar o denominador da dispersão
- 10ExemploInterpretar quartis e uma média assimétrica
- 11DesafioVerificar uma média junto com sua contagem
- 12ExemploContar categorias e proporções
- 13Ideia-chaveSeparar três perguntas sobre valores
- 14DesafioContar uma condição como fração
- 15ExplicaçãoDescrever associação com precisão
- 16DesafioLer uma matriz após verificar os dados
- 17DesafioEscolher e relatar um resumo
- 18RecapitulaçãoManter visível a regra de cada resumo
Questões de Series e DataFrames no pandas
Conjunto 1: Ler e usar uma tabela do pandas10 Questões de Prática
Questão 1 de 10
s = pd.Series([8, 13, 5], index=[2, 0, 1]). O que s[0] retorna?Mostrar respostaOcultar resposta
s.iloc[0]; chaves inteiras entre colchetes continuam sendo rótulos.Questão 2 de 10
[4.0, NaN, 9.0] e representa contagens inteiras de itens. Qual tipo de dados pode manter a lacuna enquanto armazena as contagens conhecidas como inteiros?Mostrar respostaOcultar resposta
Int64, com I maiúsculo e suporte a valores ausentes, armazena números inteiros e representa a entrada ausente como <NA>. O int64 comum não tem marcador de valor ausente e não consegue converter esse NaN. Texto preservaria uma exibição das entradas, mas não armazenaria contagens numéricas inteiras.Questão 3 de 10
[30, 10, 20]. Qual linha df.loc[10] seleciona?Mostrar respostaOcultar resposta
loc interpreta 10 como um rótulo de índice, então seleciona a segunda linha exibida. Ele não conta dez posições para a frente. A localização da linha pode mudar após a ordenação, mas seu rótulo permanece o mesmo até que o índice seja alterado explicitamente.Questão 4 de 10
df tem valores de categoria ["A", "B", "A", "B"] e massas [3, 7, 9, 4]. Quais rótulos atendem a (df["category"] == "A") | (df["mass_kg"] > 6) com o índice padrão?Mostrar respostaOcultar resposta
& em vez de |.Questão 5 de 10
[2.0, 5.0, NaN] e os preços unitários são [7.0, 3.0, 9.0]. Qual é a média padrão de seus produtos linha por linha?Mostrar respostaOcultar resposta
Questão 6 de 10
[5.0, NaN, 2.0]. Em uma ordenação decrescente padrão por valores, onde NaN aparece?Mostrar respostaOcultar resposta
na_position="first".Questão 7 de 10
a = pd.Series([6, 9], index=["east", "west"]) e b = pd.Series([4, 7], index=["west", "east"]). Quais são (a + b).loc["east"] e (a + b).loc["west"]?Mostrar respostaOcultar resposta
Questão 8 de 10
df.isna().any(axis=1).sum() retorna?Mostrar respostaOcultar resposta
any(axis=1) reduz cada linha a uma resposta: se ela contém pelo menos uma lacuna. Ambas as linhas afetadas são True, então a soma é 2. Somar as contagens de valores ausentes em todas as colunas produziria quatro células, mas essa expressão conta cada linha apenas uma vez.Questão 9 de 10
["Zoe", "Ari", "Bo", "Dee"] com pontuações [8, 8, 10, 8]. Após ordenar por pontuação decrescente e nome crescente, e selecionar as duas primeiras linhas, quais nomes aparecem em ordem?Mostrar respostaOcultar resposta
Questão 10 de 10
s contém ["A", "B", "C", "A", "B"]. Após s.replace({"C": "B"}), quais são a moda e sua frequência relativa?Mostrar respostaOcultar resposta
Conjunto 2: Escolher a operação adequada do pandas10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
.size?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
df tem cinco linhas. Quais posições de linha são selecionadas por df.iloc[1:4]?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
chosen = df[df["active"]] é seguido por chosen["score"] = 0. O que acontece com df?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
[4, 6, 9], quais rótulos resultam de np.where(s >= 6, "large", "small")?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
[90, 70, 90, 50] recebem postos com method="min", ascending=False. Quais são os postos resultantes na ordem original das linhas?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
code;mass_kg, depois 007;1,5 e 012;2,0. Qual carregamento preserva os códigos e permite calcular uma média numérica das massas?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
df tem índice [10, 20, 30] e receita [12.0, 24.0, 36.0]. Uma nova coluna recebe df.loc[df["revenue"] > 15, "revenue"] / 2. Qual é a soma padrão da nova coluna?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
[12, 4, 12, 8] recebem postos em ordem crescente com o método padrão e pct=True. Qual posto percentílico corresponde a cada 12?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
df.index é ["a", "b", "a"]. Qual é o tipo de df.loc["a"]?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 3: Verificar linhas, tipos e cálculos10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
df tem um índice sem nome [40, 60]. O que df.reset_index() faz com esses rótulos?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
501,Sensor. Como ele deve ser carregado com as colunas id e device sem perder esse primeiro registro?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
[11, 12, 13, 14], qual é a forma de df.loc[12:14, ["mass_kg"]]?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
cutoff = 6. Como query pode selecionar linhas cujo mass_kg excede essa variável Python?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
pd.Series([-2, 6, 14]).clip(lower=0, upper=10)?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
["L", "M", "L", None]. Qual proporção o value_counts(normalize=True) padrão atribui a L?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
a = pd.Series([5, 8], index=["u", "v"]) e b = pd.Series([2, 4], index=["v", "w"]). Seja c = a.add(b, fill_value=0). Quanto é c[c > 4].sum()?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
df tem índice [4, 8, 12] e preços de ponto flutuante [10.0, 20.0, 30.0]. Uma máscara seleciona os rótulos 4 e 12. Após df.loc[mask, "price"] = pd.Series([7.0, 9.0], index=[12, 4]), quais são os preços na ordem original das linhas?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
[11, 9, 9, 6]. Qual é o número de linhas e a menor pontuação retornada por df.nlargest(2, "score", keep="all")?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 4: Acompanhar várias operações em conjunto10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
df = pd.DataFrame({"a": [2, 5], "b": [7, 1]}). Quais valores df.sum(axis=1) retorna na ordem das linhas?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
s = pd.Series(["8", "bad", "2.5"]). Quais são os valores após pd.to_numeric(s, errors="coerce")?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
[7, 2, 9] e valores de x [4, 12, 8]. Seja d = df.sort_values("x", ascending=False). Quanto é d.iloc[:2]["x"].sum() - d.loc[7, "x"]?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
[2, 5, 8], quais valores atendem a .between(2, 8, inclusive="neither")?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
df tem índice [5, 9, 12], quantidade [2, 3, 4] e preço [6, 5, 2]. Ele atribui a receita, mantém receitas acima de 10 e depois atribui pd.Series([20.0], index=[9]) como adjusted. Qual é a média padrão do valor ajustado?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
[3.0, 7.0, NaN, 8.0]. Quais são sua média e contagem padrão?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
df = pd.DataFrame({"a": [2, 6], "b": [5, 3]}, index=[8, 4]). Após df = df.T, quais são df.shape e df.loc["b"].sum()?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
"1,500", "800", "unknown", "200", sem lacunas existentes. Após remover as vírgulas, fazer a coerção numérica e calcular a média padrão, quais são a média e o número de novas lacunas?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
[2.0, NaN, 8.0, 5.0]. Qual é a soma dos valores selecionados por s.notna() & (s != 5) & (s < 8)?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
[1, 2, 3, 4, 40] mm. A média é 10 mm e a mediana é 3 mm. Por que a mediana descreve melhor uma medição típica aqui?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Conjunto 5: Resolver problemas de alinhamento e resumo10 Questões de Prática
Salve esta aula para ver todas as respostas e praticar cada conjunto.
Questão 1 de 10
df. A linha seguinte é df.reset_index(). Por que df.loc[0] ainda falha?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 2 de 10
Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 3 de 10
[8, 3, 6, 1]. Quais rótulos permanecem em df.iloc[-2:][["x"]]?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 4 de 10
df tem índice ["k", "m", "p"], a [4, 8, 12] e b [3, 1, 5]. Seja d = df.loc[(df["a"] >= 8) & (df["b"] < 4), ["a", "b"]]. Quanto é d.sum(axis=1).iloc[0]?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 5 de 10
["Probe A", "sensor", None, "PROBE B"]. Quais rótulos de linha padrão atendem a .str.contains("probe", case=False, na=False)?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 6 de 10
df tem rótulos padrão e preços de ponto flutuante [8.0, 12.0, 18.0]. mask = df["price"] >= 12, depois df.loc[mask, "price"] = pd.Series([9.0], index=[2]). O que df["price"].count() retorna?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 7 de 10
[60, 90, 90, 75] na ordem das linhas. Um posto denso decrescente é atribuído como place, e a tabela é ordenada por place em ordem crescente com uma ordenação estável. Quais rótulos originais de linha aparecem primeiro?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 8 de 10
s = pd.Series(["X", "Y", "X", "Z"]). Após t = s.map({"X": 4, "Y": 10}), quais são t.count() e t.mean()?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 9 de 10
s do pandas contém [2.0, 4.0, 6.0]. Quais são s.std() e np.std(s.to_numpy()), arredondados para três casas decimais?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Questão 10 de 10
df tem x [1, 2, 3, 4], y [100, 6, 4, 2] e z [5, 5, 5, 5]. Após df.loc[df["x"] > 1, ["x", "y", "z"]].corr(), quais valores aparecem para x com y e z consigo mesmo?Mostrar respostaOcultar resposta
Salve esta aula para ver esta resposta.
Travou em uma questão sua? Ajuda com Tarefas
Termos-Chave
A
Acessor de data e hora dt
.dt.day_name() retorna o dia da semana associado a cada data de pedido.Acessor de texto str
orders["product"].str.len() calcula um comprimento de nome para cada produto registrado.Agregação
agg(["mean", "max"]) apresenta dois resumos diferentes para cada coluna numérica selecionada.Alinhamento por rótulos
Amostra aleatória
sample(3, random_state=0) é útil para verificar linhas além do início ou do fim de uma tabela.Aplicação de função por linha com apply
Associação
Atribuição de escalar
Atribuição encadeada
Atualização condicional
df.loc[mask, "price"] *= 0.9 dá desconto exatamente às linhas selecionadas pela máscara de atualização de preços.C
Cabeçalho
header=None quando a primeira linha contiver um registro real que deve permanecer nos dados.Chave de ordenação
Coerção de tipo
"7", "unknown", "2.5" com errors definido como coerce cria uma nova entrada ausente.Coluna
Coluna derivada
Conjunção lógica elemento a elemento
Contagem de ocorrências por valor
Contagem de valores distintos
Contagem de valores não nulos
Conversão de tipo
.dt.month, depois atribua a Series convertida de volta.Cópia na escrita
Correlação de Pearson
Correlação de Spearman
Correspondência de texto
"note" com case=False encontra Notebook mesmo que seu N seja maiúsculo.D
DataFrame
Delimitador
sep=";" mesmo que números dentro de seus campos usem vírgulas decimais.Desvio padrão
Difusão de um escalar
Diretório de trabalho
Disjunção lógica elemento a elemento
E
Eixo
df.sum(axis=1) soma as colunas numéricas selecionadas dentro de cada linha, fornecendo um total por linha.Erro de ponto flutuante
1.9000000000000001, que pode ser arredondado para duas casas decimais.Escalar
F
Fatia por posições
.iloc[1:3] retorna as posições 1 e 2 e pode diferir de uma fatia loc com extremos inclusos.Fatia por rótulos
.loc[1002:1004] inclui os três rótulos de pedido 1002, 1003 e 1004.Filtragem
Forma
(6, 4) e 24 células.Formato de valores separados por vírgulas
Frequência relativa
Í
Índice
population["Lima"] solicite o valor de uma cidade sem conhecer sua posição.Índice de sequência de inteiros
reset_index(drop=True) substitui os rótulos mantidos por um novo índice padrão.I
Indexador at
orders.at[2, "product"] lê o produto no rótulo 2 em uma tabela de pedidos com índice padrão.Indexador iat
orders.iat[2, 2] lê a célula na terceira linha e terceira coluna de uma tabela de pedidos.Indexador iloc
.iloc[-1] retorna a última linha mesmo que seu rótulo de índice seja um número de pedido como 1006.Indexador loc
.loc[1004, "product"] selecione o produto de um pedido identificado.Inferência de tipo
"001" em 1, a menos que seu tipo de dados seja especificado como texto.L
Limitação de valores
M
Mapeamento por dicionário
Marcador de valor ausente
na_values=["-"] informa ao leitor de CSV que um hífen no arquivo representa uma entrada ausente.Máscara booleana
Matriz de correlação
Média aritmética
Mediana
Método assign
Método between
between(5, 20, inclusive="left") inclui 5, mas exclui 20 do intervalo de preços.Método isin
["Home", "Bags"] substitui duas comparações de igualdade unidas por ou.Método isna
Método query
query("quantity >= 2 and unit_price < 5") pode expressar claramente um filtro combinado de pedidos.Método rename
rename(columns={"unit_price": "price"}) altera o nome de uma coluna sem alterar seus valores.Método reset_index
reset_index() sem outras opções.Método set_index
orders.set_index("order_id") transforma um número de pedido no rótulo usado para consultas posteriores de linhas.Moda
O
Observação
Operação vetorizada
Ordem crescente
ascending=False quando uma tabela de resultados deve exibir as maiores pontuações primeiro.Ordenação estável
kind="stable" mantém duas pontuações iguais em sua ordem anterior em vez de impor uma nova regra de desempate.P
Posição negativa
Posicionamento de valores ausentes
na_position="first" seja solicitado explicitamente.Posto
Posto denso
Posto médio
Posto mínimo
Posto percentílico
Posto por ordem de ocorrência
Prévia dos dados
head(3) permite verificar o cabeçalho e os três primeiros registros sem exibir todas as linhas.Q
Quantil
quantile(0.25) pode fornecer um quartil inferior entre duas temperaturas medidas em uma coluna de temperatura.R
Redução booleana
.any() de uma máscara pode responder se pelo menos um pedido tem quantidade ausente.S
Seleção condicional
Seleção dos n maiores valores
nlargest(1, "points", keep="all") retorna duas linhas se duas pessoas compartilharem a maior pontuação.Seletor de colunas
["product", "unit_price"] escolhe as colunas a exibir.Série do pandas
Soma acumulada
Substituição
T
Tipo de dados
float64 quando um registro tem uma quantidade em branco lida como NaN.Tipo de dados categórico
min() mesmo quando seus rótulos exibidos são texto comum.Tipo inteiro com suporte a valores ausentes
"Int64" em vez de falhar na conversão para int comum.U
Unicidade do índice
.index.is_unique antes de esperar que um identificador de pedido retorne exatamente uma linha.V
Valor não numérico
Variância
Variável de consulta
limit = 5, query("unit_price > @limit") compara preços com esse valor Python.Verificação de registros duplicados
duplicated(subset="product") marca entradas posteriores de Notebook mesmo quando todos os identificadores de pedido diferem.Sobre esta aula
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.