/
Capítulo 15, Básico
Revisão: as 20 perguntas
O curso original fecha com 20 perguntas de múltipla escolha. Aqui cada uma tem a resposta e o **motivo**, e uma célula de código que **prova** as 20 afirmações: se alguma estivesse errada, um `assert` falharia.
As perguntas e as respostas
| # | Pergunta | Resposta | Onde |
|---|---|---|---|
| 1 | s = pd.Series([10, 20, 30]); s[1] imprime... | 20: o rótulo 1 (índice padrão) | Cap. 4 |
| 2 | df[["salario"]] devolve... | Um DataFrame com uma coluna | Cap. 7 |
| 3 | Com índice padrão, quantas linhas df.loc[0:3] devolve? | 4 (o loc inclui o fim) | Cap. 7 |
| 4 | O que mostra os ausentes por coluna? | df.isnull().sum() | Cap. 9 |
| 5 | O que preenche em vez de remover? | fillna() | Cap. 9 |
| 6 | Melhor ferramenta para trocar valores por um dicionário? | map() | Cap. 11 |
| 7 | O que há de errado em df[df["a"] > 1 and df["b"] > 3]? | Falta usar & com parênteses em cada condição | Cap. 8 |
| 8 | astype(int) quebra com ausentes. A correção? | pd.to_numeric(..., errors="coerce") (ou um tipo anulável) | Cap. 10 |
| 9 | Por que uma coluna criada com apply fica cheia de None? | A função não tem return | Cap. 11 |
| 10 | Que método casa com qualquer valor de uma lista? | isin | Cap. 8 |
| 11 | Que método dá o salário médio por departamento? | groupby | Cap. 13 |
| 12 | Quantas linhas df.iloc[0:5] devolve? | 5 (o iloc exclui o fim) | Cap. 7 |
| 13 | Com índice id_funcionario, o que df.iloc[0] devolve? | A primeira linha física, qualquer que seja o rótulo | Cap. 7 |
| 14 | O que faz o ~ em df[~(df["c"] == "x")]? | Nega a condição | Cap. 8 |
| 15 | Por que o dropna() sem argumentos é perigoso? | Uma coluna ruim apaga linhas boas das outras | Cap. 9 |
| 16 | O que o duplicated() compara por padrão? | Todas as colunas | Cap. 10 |
| 17 | Por que o to_numeric(coerce) é mais seguro que o astype(float)? | Valores ruins viram NaN, e a execução continua | Cap. 10 |
| 18 | Qual lambda é válido? | lambda x: "Alto" if x > 70000 else "Normal" | Cap. 11 |
| 19 | nlargest(5, c) contra sort_values(c).head(5)? | O mesmo resultado, sem ordenar a coluna inteira | Cap. 12 |
| 20 | Por que resumo["departamento"] dá KeyError depois de um agg? | O departamento virou o índice | Cap. 13 |
A prova
import numpy as np
import pandas as pd
df = pd.read_csv("dados/funcionarios_15.csv")
def levanta(excecao, funcao):
try:
funcao()
except excecao:
return True
return False
# 1 a 3
assert pd.Series([10, 20, 30])[1] == 20
assert isinstance(df[["salario"]], pd.DataFrame)
assert len(df.loc[0:3]) == 4
# 4 e 5
assert df.isnull().sum().equals(df.isna().sum()) and int(df.isnull().sum()["cidade"]) == 2
assert df["idade"].fillna(0).isna().sum() == 0 and len(df.dropna()) < len(df)
# 6
assert pd.Series(["a", "b"]).map({"a": "x", "b": "y"}).tolist() == ["x", "y"]
# 7: o `and` do Python não funciona em uma Series
assert levanta(ValueError, lambda: df[(df["experiencia"] > 3) and (df["nota_desempenho"] > 7)])
# 8 e 17: astype(int) quebra, to_numeric(coerce) converte o que dá
assert levanta(ValueError, lambda: df["idade"].astype(int))
texto = pd.Series(["10", "abc", "30"])
assert pd.to_numeric(texto, errors="coerce").tolist()[0] == 10 and pd.to_numeric(texto, errors="coerce").isna().sum() == 1
# 9: sem return, tudo vira None
def sem_return(x):
if x > 3:
"alto"
assert df["experiencia"].apply(sem_return).isna().all()
# 10 e 11
assert df["departamento"].isin(["Engenharia", "RH"]).sum() == 5
assert df.groupby("departamento")["experiencia"].mean().notna().all()
# 12 e 13
assert len(df.iloc[0:5]) == 5
por_id = df.set_index("id_funcionario")
assert por_id.iloc[0]["nome"] == "Ana Souza" and levanta(KeyError, lambda: por_id.loc[0])
# 14
assert (~(df["cidade"] == "Curitiba")).sum() == len(df) - 2
# 15 e 16
assert len(df.dropna()) == 9 and int(df.duplicated().sum()) == 0
# 18
assert (lambda x: "Alto" if x > 70000 else "Normal")(80000) == "Alto"
# 19
assert df.nlargest(5, "projetos_concluidos")["projetos_concluidos"].tolist() == \
df.sort_values("projetos_concluidos", ascending=False).head(5)["projetos_concluidos"].tolist()
# 20
resumo = df.groupby("departamento").agg(media=("experiencia", "mean"))
assert levanta(KeyError, lambda: resumo["departamento"]) and "departamento" in resumo.reset_index().columns
print("as 20 respostas conferem")
Saída
as 20 respostas conferem
Se você errou alguma pergunta, o melhor é voltar ao capítulo da última coluna da tabela, rodar o exemplo e mudar o código para ver o que acontece. Decorar a resposta não adianta: o que fica é ter visto o Pandas falhar.