HOWTO · Pandas
Como selecionar várias colunas num DataFrame do Pandas
Aprenda a selecionar várias colunas de um DataFrame do Pandas com parênteses retos, indexação por posição com `.iloc` e seleção por rótulo com `.loc`. Compare as sintaxes e escolha a mais adequada à sua tarefa.
Nesta página
Para selecionar várias colunas de um DataFrame do Pandas pelo nome, passe uma lista de rótulos entre parênteses retos: df[["Name", "Salary"]]. Use .iloc quando souber as posições das colunas e .loc quando precisar de selecionar linhas e colunas pelos respetivos rótulos.
Seleção com parênteses retos (__getitem__)
A seleção com parênteses retos é a opção direta quando conhece os nomes das colunas. Os parênteses retos exteriores selecionam dados do DataFrame; a lista interior contém os rótulos. Esta secção aborda a seleção por __getitem__. O Pandas devolve as colunas pedidas pela ordem em que aparecem na lista, independentemente da ordem no DataFrame original.
O exemplo seguinte usa um único DataFrame pequeno para comparar a seleção por nome, por posição e por rótulo. Cada resultado contém todas as linhas e as colunas escolhidas pela ordem pedida.
import pandas as pd
df = pd.DataFrame({
"Name": ["Alice", "Bob", "Charlie", "David"],
"Age": [24, 30, 22, 35],
"City": ["New York", "Los Angeles", "Chicago", "Houston"],
"Salary": [70000, 80000, 65000, 90000],
})
by_name = df[["Name", "Salary"]]
by_position = df.iloc[:, [0, 3]]
by_label = df.loc[:, ["City", "Age"]]
print("By name:")
print(by_name.to_dict("records"))
print("\nBy position:")
print(by_position.to_dict("records"))
print("\nBy label:")
print(by_label.to_dict("records"))
By name:
[{'Name': 'Alice', 'Salary': 70000}, {'Name': 'Bob', 'Salary': 80000}, {'Name': 'Charlie', 'Salary': 65000}, {'Name': 'David', 'Salary': 90000}]
By position:
[{'Name': 'Alice', 'Salary': 70000}, {'Name': 'Bob', 'Salary': 80000}, {'Name': 'Charlie', 'Salary': 65000}, {'Name': 'David', 'Salary': 90000}]
By label:
[{'City': 'New York', 'Age': 24}, {'City': 'Los Angeles', 'Age': 30}, {'City': 'Chicago', 'Age': 22}, {'City': 'Houston', 'Age': 35}]
A operação __getitem__ é invocada quando se acede a um DataFrame com parênteses retos. Em geral, deve usar esta sintaxe mais legível em vez de chamar diretamente esse método especial.
Seleção por posição com .iloc
.iloc é o indexador do Pandas baseado em posições inteiras. Em df.iloc[:, [0, 3]], os dois-pontos antes da vírgula selecionam todas as linhas, enquanto [0, 3] seleciona a primeira e a quarta colunas. As posições começam em zero, pelo que uma alteração na ordem das colunas do DataFrame pode mudar os dados selecionados por esses números. Use .iloc quando a posição for relevante ou quando não tiver os rótulos disponíveis.
Seleção por rótulo com .loc
.loc é o indexador baseado em rótulos. Em df.loc[:, ["City", "Age"]], o seletor de linhas é : e o seletor de colunas é uma lista de rótulos. Assim, a ordem pedida mantém-se: City e depois Age. Também pode combinar uma condição para as linhas com uma lista de colunas, como em df.loc[df["Age"] > 25, ["Name", "City"]], para manter as linhas correspondentes e devolver apenas essas colunas. Use .loc quando a seleção depender de rótulos ou quando precisar de escolher linhas e colunas em simultâneo.
Conclusão
Use df[["a", "b"]] para selecionar várias colunas pelo nome, .iloc para usar posições inteiras e .loc para selecionar por rótulos, com a possibilidade de filtrar linhas. Escolha os rótulos quando os nomes das colunas indicarem o que procura; escolha posições quando a ordem das colunas for a informação relevante.
FAQ
Como seleciono colunas pelo nome? Passe uma lista de rótulos entre os parênteses retos do DataFrame, por exemplo, df[["column1", "column2"]].
Qual é a diferença entre .iloc e .loc? .iloc seleciona por posições inteiras, começando em zero; .loc seleciona por rótulos. Ambos aceitam seletores de linhas e colunas separados por uma vírgula.
Posso selecionar linhas e colunas em simultâneo? Sim. Com .loc, coloque um rótulo ou uma condição para as linhas antes da vírgula e os rótulos das colunas pretendidas depois, por exemplo, df.loc[df["Age"] > 25, ["Name", "City"]].
Que sintaxe devo usar? Use parênteses retos com uma lista quando conhecer os nomes das colunas, .iloc quando souber as posições inteiras e .loc quando quiser selecionar por rótulos e, possivelmente, filtrar linhas ao mesmo tempo.
E se precisar de selecionar muitas colunas? Coloque os nomes pretendidos numa lista. Se as colunas formarem um intervalo contíguo, .iloc pode usar uma fatia; lembre-se de que uma fatia de .iloc termina antes da posição final indicada. Para um conjunto não contíguo, forneça uma lista de posições ou de rótulos.