Menu
CoddyTech

Pandas Cheat Sheet: Folha de Consulta

Última atualização

Criar um DataFrame

DataFrames pequenos montados à mão, para exemplos, testes e tabelas de consulta.

TarefaCódigo
Importar pandas e NumPyimport pandas as pd import numpy as np
A partir de um dict de colunasdf = pd.DataFrame({"name": ["Ada", "Ben"], "age": [36, 28]})
A partir de uma lista de linhaspd.DataFrame([{"name": "Ada", "age": 36}, {"name": "Ben", "age": 28}])
A partir de um array NumPypd.DataFrame(np.arange(6).reshape(3, 2), columns=["x", "y"])
Uma Series com rótuloss = pd.Series([3, 5, 2], index=["a", "b", "c"])
Um intervalo de dataspd.date_range("2026-01-01", periods=7, freq="D")

Ler e gravar arquivos

Uma chamada carrega um arquivo em um DataFrame, e outra grava de volta.

TarefaCódigo
Ler um arquivo CSVdf = pd.read_csv("sales.csv")
Só algumas colunas, com datas de verdadepd.read_csv("sales.csv", usecols=["date", "city", "sales"], parse_dates=["date"])
Usar uma coluna como índicepd.read_csv("sales.csv", index_col="id")
Tab ou outro separadorpd.read_csv("sales.tsv", sep="\t")
Tratar outros marcadores como ausentespd.read_csv("sales.csv", na_values=["n/a", "-"])
Ler só as primeiras linhaspd.read_csv("sales.csv", nrows=1000)
Ler uma planilha Excel (requer openpyxl)pd.read_excel("report.xlsx", sheet_name="2026")
Ler registros JSONpd.read_json("records.json")
Ler de um banco SQLpd.read_sql("SELECT * FROM orders", conn)
Gravar CSV sem o índicedf.to_csv("clean.csv", index=False)
Gravar Excel ou Parquetdf.to_excel("clean.xlsx", index=False), df.to_parquet("clean.parquet")

Inspecionar os dados

As primeiras chamadas a fazer em qualquer dataset novo.

TarefaCódigo
Primeiras e últimas linhasdf.head(), df.tail(3)
Número de linhas e colunasdf.shape # (6, 7)
Tipos e contagem de não nulosdf.info()
Estatísticas das colunas numéricasdf.describe()
Resumo de todas as colunasdf.describe(include="all")
Nomes e tipos das colunasdf.columns, df.dtypes
Contar cada valordf["city"].value_counts()
Proporção de cada valordf["city"].value_counts(normalize=True)
Valores distintos e quantos sãodf["city"].unique(), df["city"].nunique()
Valores ausentes por colunadf.isna().sum()
Amostra aleatória de linhasdf.sample(3, random_state=0)
Correlação das colunas numéricasdf.corr(numeric_only=True)

Selecionar colunas e linhas

loc seleciona por rótulo e inclui o fim da fatia. iloc seleciona por posição e exclui o fim.

TarefaCódigo
Uma coluna, como Seriesdf["age"]
Várias colunas, como DataFramedf[["name", "age"]]
Linhas e colunas por rótulodf.loc[0:2, ["name", "age"]]
Linhas e colunas por posiçãodf.iloc[0:2, 0:3]
Um único valordf.at[0, "age"], df.iat[0, 3]
Última linhadf.iloc[-1]
Colunas de um tipodf.select_dtypes(include="number")
Colunas de texto (pandas 3)df.select_dtypes(include="str")
Colunas pelo nomedf.filter(like="sal"), df.filter(regex="^(age|salary)$")
Buscar linhas por uma colunadf.set_index("name").loc["Ada", "salary"]
Voltar a um índice 0, 1, 2df.reset_index(drop=True)
Remover colunas ou linhasdf.drop(columns=["email"]), df.drop(index=[0, 1])

Filtrar linhas

Coloque cada condição entre parênteses e combine com & (e), | (ou) e ~ (não).

TarefaCódigo
Linhas que atendem a uma condiçãodf[df["age"] > 30]
As duas condiçõesdf[(df["age"] > 30) & (df["city"] == "Oslo")]
Qualquer uma das condiçõesdf[(df["city"] == "Oslo") | (df["salary"] > 6000)]
Valor em uma listadf[df["city"].isin(["Oslo", "Rome"])]
Valor fora de uma listadf[~df["city"].isin(["Oslo", "Rome"])]
Entre dois valores, extremos inclusosdf[df["age"].between(30, 40)]
Filtrar com uma string de querydf.query("age > 30 and city == 'Oslo'")
Usar uma variável na querymin_age = 30 df.query("age > @min_age")
Texto contémdf[df["name"].str.contains("e", case=False)]
Valores ausentes ou presentesdf[df["age"].isna()], df[df["age"].notna()]
Filtrar linhas e escolher colunasdf.loc[df["age"] > 30, ["name", "salary"]]
As n maiores ou menores linhasdf.nlargest(3, "salary"), df.nsmallest(2, "age")
Linhas com valor repetidodf[df.duplicated(subset=["city"], keep=False)]

Ordenar e ranquear

TarefaCódigo
Ordenar por uma colunadf.sort_values("salary")
Maiores primeirodf.sort_values("salary", ascending=False)
Ordenar por várias colunasdf.sort_values(["city", "salary"], ascending=[True, False])
Valores ausentes primeirodf.sort_values("age", na_position="first")
Ordenar pelo índicedf.sort_index()
Ranquear valores, 1 é o maiordf["salary"].rank(ascending=False)

Adicionar e alterar colunas

Operações na coluna inteira são rápidas. Use apply só quando nenhum método nativo resolver.

TarefaCódigo
Nova coluna a partir de outrasdf["bonus"] = df["salary"] * 0.1
Adicionar coluna dentro de uma cadeiadf.assign(bonus=lambda d: d["salary"] * 0.1)
Valor a partir de uma condiçãodf["level"] = np.where(df["age"] >= 40, "senior", "junior")
Valor a partir de várias condiçõesdf["band"] = np.select([df["age"] < 30, df["age"] < 45], ["young", "mid"], default="senior")
Alterar valores onde a condição valedf.loc[df["city"] == "Lima", "salary"] = 4000
Mapear valores com um dictdf["country"] = df["city"].map({"Oslo": "NO", "Rome": "IT", "Lima": "PE"})
Aplicar uma função a uma colunadf["salary"].apply(lambda x: round(x, -3))
Aplicar uma função a cada céluladf[["age", "salary"]].map(lambda x: x / 1000)
Renomear colunasdf.rename(columns={"salary": "pay"})
Mudar o tipo de uma colunadf["salary"].astype("float64")
Texto para número, inválidos viram NaNpd.to_numeric(s, errors="coerce")
Números em faixas com rótulopd.cut(df["age"], bins=[0, 30, 45, 120], labels=["young", "mid", "senior"])
Números em grupos de mesmo tamanhopd.qcut(df["salary"], q=4, labels=False)
Percorrer linhas (lento, último recurso)for row in df.itertuples(): print(row.name, row.salary)

Valores ausentes e limpeza

Números ausentes aparecem como NaN, datas ausentes como NaT. Cada uma destas chamadas devolve um objeto novo, então atribua o resultado.

TarefaCódigo
Proporção de ausentes por colunadf.isna().mean()
Remover linhas com algum ausentedf.dropna()
Remover linhas sem uma coluna-chavedf.dropna(subset=["age"])
Preencher com um valor por colunadf.fillna({"age": df["age"].median()})
Preencher com a linha anterior ou seguintedf["age"].ffill(), df["age"].bfill()
Preencher lacunas por interpolaçãodf["age"].interpolate()
Transformar marcadores em ausentesdf.replace(["n/a", "-", ""], np.nan)
Remover linhas duplicadasdf.drop_duplicates()
Manter a última linha por chavedf.drop_duplicates(subset=["city"], keep="last")
Arrumar nomes de colunasdf.columns = df.columns.str.strip().str.lower().str.replace(" ", "_")
Limitar valores extremosdf["salary"].clip(lower=4000, upper=6000)
Tipo category para texto repetidodf["city"] = df["city"].astype("category")

Colunas de texto (.str)

No pandas 3, colunas de texto recebem o dtype str por padrão. Os métodos .str funcionam na coluna inteira, e valores ausentes continuam ausentes.

TarefaCódigo
Maiúsculas, minúsculas ou títulodf["name"].str.upper(), df["name"].str.lower(), df["name"].str.title()
Remover espaçosdf["name"].str.strip()
Substituir textodf["email"].str.replace("mail.com", "example.com")
Substituir com regexdf["email"].str.replace(r"@.*", "", regex=True)
Contém, começa comdf["name"].str.contains("a"), df["name"].str.startswith("E")
Tamanho de cada valordf["name"].str.len()
Primeiros caracteresdf["name"].str[:2]
Dividir em colunasdf["email"].str.split("@", expand=True)
Extrair com grupo de regexdf["email"].str.extract(r"@(\w+)")
Juntar colunas de textodf["name"] + " (" + df["city"] + ")"
Completar números com zerosdf["salary"].astype("str").str.zfill(6)
O novo dtype de textodf["name"].dtype # str

Datas e horas

O acessor .dt funciona em colunas datetime. Um índice de datas ordenado (ts abaixo) permite fatiar por texto e fazer resampling.

TarefaCódigo
Converter coluna para datetimedf["date"] = pd.to_datetime(df["date"])
Converter com formato exatopd.to_datetime(["03/01/2026", "15/01/2026"], format="%d/%m/%Y")
Ano, mês, nome do dia da semanadf["date"].dt.year, df["date"].dt.month, df["date"].dt.day_name()
Agrupar datas por mêsdf["date"].dt.to_period("M")
Dias entre duas datas(pd.Timestamp("2026-12-31") - df["date"]).dt.days
Somar dias ou mesesdf["date"] + pd.Timedelta(days=30), df["date"] + pd.DateOffset(months=1)
Linhas em um intervalo de datasdf[df["date"].between("2021-01-01", "2022-12-31")]
Índice de datas, fatiado por textots = df.set_index("date").sort_index() ts.loc["2021":"2022"]
Total por mêsts["salary"].resample("ME").sum()
Média semanal; "QE" é trimestral, "YE" anualts["salary"].resample("W").mean()
Média móvelts["salary"].rolling(3).mean()
Variação em relação à linha anteriorts["salary"].diff(), ts["salary"].pct_change()
Deslocar valores uma linha para baixots["salary"].shift(1)
Total acumuladots["salary"].cumsum()
Definir e converter fusos horáriosts.index.tz_localize("UTC").tz_convert("Europe/Oslo")

Agrupar e agregar

groupby divide as linhas por chave, aplica uma função a cada grupo e combina os resultados.

TarefaCódigo
Média por grupodf.groupby("city")["salary"].mean()
Várias estatísticas de uma vezdf.groupby("city")["salary"].agg(["mean", "max", "count"])
Colunas de resultado com nomedf.groupby("city").agg(avg_pay=("salary", "mean"), people=("name", "count"))
Agrupar por duas colunasdf.groupby(["city", "team"])["salary"].sum()
Manter as chaves como colunasdf.groupby("city", as_index=False)["salary"].mean()
Número de linhas por grupodf.groupby("city").size()
Resultado do grupo em cada linhadf["city_avg"] = df.groupby("city")["salary"].transform("mean")
Manter só alguns gruposdf.groupby("city").filter(lambda g: len(g) >= 2)
Linha com o máximo de cada grupodf.loc[df.groupby("city")["salary"].idxmax()]
As n maiores linhas por grupodf.sort_values("salary", ascending=False).groupby("city").head(2)
Numerar as linhas de cada grupodf.groupby("city").cumcount()
Percorrer os gruposfor city, group in df.groupby("city"): print(city, len(group))
Filtrar, agrupar e ordenar numa cadeia(df.query("age > 30") .groupby("city", as_index=False) .agg(avg_pay=("salary", "mean")) .sort_values("avg_pay", ascending=False))

Pivotar e remodelar

Dados longos têm uma linha por observação. Dados largos espalham uma variável por várias colunas.

TarefaCódigo
Tabela dinâmicadf.pivot_table(index="city", columns="team", values="salary", aggfunc="mean", fill_value=0)
Tabela dinâmica com totaisdf.pivot_table(index="city", values="salary", aggfunc="sum", margins=True)
Contar combinaçõespd.crosstab(df["city"], df["team"])
Proporções por linhapd.crosstab(df["city"], df["team"], normalize="index")
De largo para longolong = df.melt(id_vars="name", value_vars=["age", "salary"], var_name="field", value_name="value")
De longo para largolong.pivot(index="name", columns="field", values="value")
Nível interno do índice para colunasdf.groupby(["city", "team"])["salary"].sum().unstack(fill_value=0)
Uma linha por item da listapd.DataFrame({"id": [1, 2], "tags": [["a", "b"], ["c"]]}).explode("tags")
One-hot encoding de uma colunapd.get_dummies(df["team"], prefix="team")
Trocar linhas e colunasdf.T

Combinar DataFrames

concat empilha frames, merge junta por colunas-chave como um join de SQL.

TarefaCódigo
Empilhar linhaspd.concat([df_2025, df_2026], ignore_index=True)
Colocar lado a ladopd.concat([left, right], axis=1)
Juntar por uma coluna-chaveorders.merge(customers, on="customer_id", how="left")
Tipos de joinhow="inner", "left", "right", "outer"
Chaves com nomes diferentesorders.merge(users, left_on="customer_id", right_on="id")
Validar o join e marcar a origem de cada linhaorders.merge(customers, on="customer_id", how="left", validate="many_to_one", indicator=True)
Juntar pelo índiceleft.join(right, how="inner")
Linhas sem correspondência na outra tabelaorders[~orders["customer_id"].isin(customers["customer_id"])]

Gráficos com pandas

O pandas desenha com Matplotlib. Toda chamada de plot devolve um ax do Matplotlib, então você pode continuar estilizando.

TarefaCódigo
Gráfico de linha de uma sériets["salary"].plot()
Gráfico de linha com duas colunasdf.plot(x="date", y="salary")
Gráfico de barras de um resumodf.groupby("city")["salary"].mean().plot.bar()
Barras horizontais ordenadasdf["city"].value_counts().sort_values().plot.barh()
Histogramadf["salary"].plot.hist(bins=20)
Gráfico de dispersãodf.plot.scatter(x="age", y="salary")
Boxplot por grupodf.boxplot(column="salary", by="city")
Título e rótulo do eixoax = df.plot(x="date", y="salary", title="Salary") ax.set_ylabel("EUR")
Mostrar ou salvar o gráficoplt.show(), ax.figure.savefig("salary.png", dpi=150)

pandas 3: formas antigas e o que escrever agora

Código copiado de tutoriais antigos costuma falhar ou gerar avisos no pandas 3. Use as formas da coluna pandas 3.

Tarefapandas 3Forma antiga
Função em cada céluladf.map(f)df.applymap(f)
Preencher com a linha anteriordf.ffill()df.fillna(method="ffill")
Adicionar linhaspd.concat([df, new_rows])df.append(new_rows)
Resampling no fim do mêsts["salary"].resample("ME").sum()resample("M")
Datas por horapd.date_range("2026-01-01", periods=24, freq="h")freq="H"
Definir um valordf.loc[0, "age"] = 37df["age"][0] = 37
Alterar um subconjunto filtradohigh = df[df["salary"] > 5000] high["salary"] = 0high = df[df["salary"] > 5000].copy()
É uma coluna de texto?df["name"].dtype == "str"df["name"].dtype == object

O código pandas que um analista de dados usa todo dia, organizado por tarefa: criar e carregar dados, inspecionar, selecionar e filtrar linhas, adicionar colunas, tratar valores ausentes, trabalhar com texto e datas, agrupar e agregar, remodelar, juntar e plotar. Cada linha traz um trecho curto para colar e uma frase sobre o que ele faz.

Tudo aqui foi escrito para o pandas 3, a versão que a Coddy roda: colunas de texto usam o novo dtype str, o Copy-on-Write está sempre ativo, e APIs removidas como applymap e fillna(method=...) aparecem só na tabela de formas antigas. Os exemplos usam um DataFrame df com as colunas name, city, team, age, salary, date e email. Está começando em Python? Comece pela folha de consulta Python e pelo playground de Python, e deixe as folhas de consulta de NumPy, Matplotlib e scikit-learn abertas ao lado desta.

Perguntas frequentes sobre a folha de consulta pandas

Esta folha de consulta de pandas é grátis?
Sim. Esta folha de consulta de pandas é totalmente grátis, sem cadastro. Salve nos favoritos ou imprima em PDF pelo navegador, e volte sempre que precisar da chamada exata para um groupby, um merge ou uma tabela dinâmica.
Qual versão do pandas esta folha de consulta cobre?
O pandas 3. Colunas de texto usam o novo dtype str, o Copy-on-Write está sempre ativo, e chamadas removidas no pandas 3 (applymap, fillna(method=...), append, os aliases de frequência M e H) aparecem só na última tabela, ao lado do que escrever no lugar. Quase todos os trechos também rodam no pandas 2.2, exceto as linhas que dependem do dtype str ou do Copy-on-Write.
Qual é a diferença entre loc e iloc?
loc seleciona por rótulo, ou seja, pelos valores do índice e nomes das colunas, e uma fatia como df.loc[0:2] inclui o fim. iloc seleciona por posição inteira, como uma lista Python, então df.iloc[0:2] devolve as duas primeiras linhas e exclui o fim. Use loc com uma condição para filtrar linhas e escolher colunas de uma vez: df.loc[df["age"] > 30, ["name"]].
Como filtro um DataFrame com várias condições?
Coloque cada condição entre parênteses e junte com & para e, | para ou e ~ para não: df[(df["age"] > 30) & (df["city"] == "Oslo")]. O and e o or do Python não funcionam em colunas inteiras. Para filtros longos, df.query("age > 30 and city == 'Oslo'") é mais fácil de ler.
Qual é a diferença entre merge, join e concat?
merge combina dois DataFrames por colunas-chave, como um join de SQL, com how="inner", "left", "right" ou "outer". join é um atalho que faz o merge pelo índice. concat não compara chaves: ele empilha os frames um sobre o outro, ou lado a lado com axis=1.
Por que minha atribuição não altera o DataFrame?
Desde o pandas 3, o Copy-on-Write faz toda seleção se comportar como uma cópia. Uma atribuição encadeada como df["age"][0] = 37 altera um objeto temporário e deixa o df intacto. Escreva tudo em uma chamada loc: df.loc[0, "age"] = 37. Métodos como dropna e fillna também devolvem um objeto novo, então atribua o resultado.
Posso rodar código pandas online?
Sim. O playground de Matplotlib grátis roda Python com pandas, NumPy, Matplotlib e scikit-learn no navegador, então você pode colar qualquer trecho desta folha de consulta e rodar sem instalar nada. O curso de Machine Learning da Coddy ensina pandas passo a passo, do seu primeiro DataFrame até os dados que alimentam um modelo.
Ilustração das linguagens de programação do Coddy

Aprenda Pandas com a Coddy

COMEÇAR