Há duas maneiras principais pelas quais os pandas fazem seleções em um DataFrame.
- Por etiqueta
- Por local inteiro
A documentação usa o termo posição para se referir ao local inteiro . Não gosto dessa terminologia, pois sinto que é confusa. A localização inteira é mais descritiva e é exatamente o que .iloc
significa. A palavra-chave aqui é INTEGER - você deve usar números inteiros ao selecionar por local inteiro.
Antes de mostrar o resumo, vamos ter certeza de que ...
.ix está obsoleto e ambíguo e nunca deve ser usado
Existem três indexadores principais para pandas. Temos o próprio operador de indexação (os colchetes []
) .loc
, e .iloc
. Vamos resumir eles:
[]
- Seleciona principalmente subconjuntos de colunas, mas também pode selecionar linhas. Não é possível selecionar simultaneamente linhas e colunas.
.loc
- seleciona subconjuntos de linhas e colunas somente por rótulo
.iloc
- seleciona subconjuntos de linhas e colunas apenas por localização inteira
Eu quase nunca uso .at
ou .iat
porque eles não adicionam funcionalidade adicional e apenas com um pequeno aumento de desempenho. Eu desencorajaria o uso deles, a menos que você tenha um aplicativo muito sensível ao tempo. Independentemente disso, temos o resumo deles:
.at
seleciona um único valor escalar no DataFrame apenas por rótulo
.iat
seleciona um único valor escalar no DataFrame apenas por local inteiro
Além da seleção por rótulo e local inteiro, existe a seleção booleana também conhecida como indexação booleana .
Exemplos explicando .loc
, .iloc
, booleano selecção e .at
e .iat
são mostrados abaixo
Vamos nos concentrar primeiro nas diferenças entre .loc
e .iloc
. Antes de falarmos sobre as diferenças, é importante entender que os DataFrames têm rótulos que ajudam a identificar cada coluna e cada linha. Vamos dar uma olhada em um exemplo de DataFrame:
df = pd.DataFrame({'age':[30, 2, 12, 4, 32, 33, 69],
'color':['blue', 'green', 'red', 'white', 'gray', 'black', 'red'],
'food':['Steak', 'Lamb', 'Mango', 'Apple', 'Cheese', 'Melon', 'Beans'],
'height':[165, 70, 120, 80, 180, 172, 150],
'score':[4.6, 8.3, 9.0, 3.3, 1.8, 9.5, 2.2],
'state':['NY', 'TX', 'FL', 'AL', 'AK', 'TX', 'TX']
},
index=['Jane', 'Nick', 'Aaron', 'Penelope', 'Dean', 'Christina', 'Cornelia'])
Todas as palavras em negrito são os rótulos. As etiquetas, age
, color
, food
, height
, score
e state
são usados para as colunas . Os outros rótulos, Jane
, Nick
, Aaron
, Penelope
, Dean
, Christina
, Cornelia
são usados como rótulos para as linhas. Coletivamente, esses rótulos de linha são conhecidos como índice .
As principais maneiras de selecionar linhas específicas em um DataFrame são com os indexadores .loc
e .iloc
. Cada um desses indexadores também pode ser usado para selecionar colunas simultaneamente, mas é mais fácil focar apenas nas linhas por enquanto. Além disso, cada um dos indexadores usa um conjunto de colchetes que seguem imediatamente seu nome para fazer suas seleções.
.loc seleciona dados apenas por rótulos
Primeiro, falaremos sobre o .loc
indexador, que seleciona apenas os dados pelos rótulos do índice ou da coluna. Em nosso exemplo DataFrame, fornecemos nomes significativos como valores para o índice. Muitos DataFrames não terão nomes significativos e, em vez disso, usarão como padrão apenas os números inteiros de 0 a n-1, onde n é o comprimento (número de linhas) do DataFrame.
Existem muitas entradas diferentes que você pode usar para .loc
três delas são
- Uma linha
- Uma lista de strings
- Notação de fatia usando cadeias como valores de início e parada
Selecionando uma única linha com .loc com uma sequência
Para selecionar uma única linha de dados, coloque o rótulo do índice dentro dos colchetes a seguir .loc
.
df.loc['Penelope']
Isso retorna a linha de dados como uma série
age 4
color white
food Apple
height 80
score 3.3
state AL
Name: Penelope, dtype: object
Selecionando várias linhas com .loc com uma lista de cadeias
df.loc[['Cornelia', 'Jane', 'Dean']]
Isso retorna um DataFrame com as linhas na ordem especificada na lista:
Selecionando várias linhas com .loc com notação de fatia
A notação de fatia é definida pelos valores de início, parada e etapa. Ao fatiar por etiqueta, os pandas incluem o valor de parada no retorno. As seguintes fatias de Aaron a Dean, inclusive. Seu tamanho da etapa não é explicitamente definido, mas o padrão é 1.
df.loc['Aaron':'Dean']
Fatias complexas podem ser obtidas da mesma maneira que as listas Python.
.iloc seleciona dados apenas por localização inteira
Vamos agora voltar para .iloc
. Cada linha e coluna de dados em um DataFrame tem um local inteiro que o define. Isso é um acréscimo ao rótulo que é exibido visualmente na saída. O local inteiro é simplesmente o número de linhas / colunas da parte superior / esquerda começando em 0.
Existem muitas entradas diferentes que você pode usar para .iloc
três delas são
- Um inteiro
- Uma lista de números inteiros
- Notação de fatia usando números inteiros como valores inicial e final
Selecionando uma única linha com .iloc com um número inteiro
df.iloc[4]
Isso retorna a 5ª linha (local inteiro 4) como uma Série
age 32
color gray
food Cheese
height 180
score 1.8
state AK
Name: Dean, dtype: object
Selecionando várias linhas com .iloc com uma lista de números inteiros
df.iloc[[2, -2]]
Isso retorna um DataFrame da terceira e da segunda à última linhas:
Selecionando várias linhas com .iloc com notação de fatia
df.iloc[:5:3]
Seleção simultânea de linhas e colunas com .loc e .iloc
Uma excelente capacidade de ambos .loc/.iloc
é a capacidade de selecionar linhas e colunas simultaneamente. Nos exemplos acima, todas as colunas foram retornadas de cada seleção. Podemos escolher colunas com os mesmos tipos de entradas que fazemos para as linhas. Simplesmente precisamos separar a seleção de linha e coluna com uma vírgula .
Por exemplo, podemos selecionar as linhas Jane e Dean com apenas as colunas altura, pontuação e estado da seguinte forma:
df.loc[['Jane', 'Dean'], 'height':]
Isso usa uma lista de rótulos para as linhas e notação de fatia para as colunas
Naturalmente, podemos realizar operações semelhantes .iloc
usando apenas números inteiros.
df.iloc[[1,4], 2]
Nick Lamb
Dean Cheese
Name: food, dtype: object
Seleção simultânea com rótulos e localização de número inteiro
.ix
foi usado para fazer seleções simultaneamente com rótulos e local inteiro, o que foi útil, mas às vezes confuso e ambíguo e, felizmente, foi preterido. No caso de você precisar fazer uma seleção com uma mistura de rótulos e locais inteiros, será necessário fazer rótulos de seleção ou locais inteiros.
Por exemplo, se quisermos selecionar linhas Nick
e, Cornelia
juntamente com as colunas 2 e 4, poderíamos usar .loc
convertendo os números inteiros em rótulos com o seguinte:
col_names = df.columns[[2, 4]]
df.loc[['Nick', 'Cornelia'], col_names]
Ou, alternativamente, converta os rótulos de índice em números inteiros com o get_loc
método index.
labels = ['Nick', 'Cornelia']
index_ints = [df.index.get_loc(label) for label in labels]
df.iloc[index_ints, [2, 4]]
Seleção booleana
O indexador .loc também pode fazer a seleção booleana. Por exemplo, se estivermos interessados em encontrar todas as linhas com idade acima de 30 anos e retornar apenas as colunas food
e score
, podemos fazer o seguinte:
df.loc[df['age'] > 30, ['food', 'score']]
Você pode replicar isso com, .iloc
mas não pode transmitir uma série booleana. Você deve converter a série booleana em uma matriz numpy como esta:
df.iloc[(df['age'] > 30).values, [2, 4]]
Selecionando todas as linhas
É possível usar .loc/.iloc
apenas para seleção de coluna. Você pode selecionar todas as linhas usando dois pontos como este:
df.loc[:, 'color':'score':2]
O operador de indexação,, []
pode fatiar, pode selecionar linhas e colunas também, mas não simultaneamente.
A maioria das pessoas conhece o objetivo principal do operador de indexação DataFrame, que é selecionar colunas. Uma cadeia de caracteres seleciona uma única coluna como uma série e uma lista de cadeias seleciona várias colunas como um DataFrame.
df['food']
Jane Steak
Nick Lamb
Aaron Mango
Penelope Apple
Dean Cheese
Christina Melon
Cornelia Beans
Name: food, dtype: object
O uso de uma lista seleciona várias colunas
df[['food', 'score']]
O que as pessoas estão menos familiarizadas é que, quando a notação de fatia é usada, a seleção acontece por rótulos de linha ou por local inteiro. Isso é muito confuso e algo que quase nunca uso, mas funciona.
df['Penelope':'Christina'] # slice rows by label
df[2:6:2] # slice rows by integer location
A explicitação de .loc/.iloc
para selecionar linhas é altamente preferida. O operador de indexação sozinho não pode selecionar linhas e colunas simultaneamente.
df[3:5, 'color']
TypeError: unhashable type: 'slice'
Seleção por .at
e.iat
A seleção com .at
é quase idêntica, .loc
mas apenas seleciona uma única 'célula' no seu DataFrame. Geralmente, nos referimos a essa célula como um valor escalar. Para usar .at
, passe um rótulo de linha e coluna separados por vírgula.
df.at['Christina', 'color']
'black'
A seleção com .iat
é quase idêntica, .iloc
mas somente seleciona um único valor escalar. Você deve passar um número inteiro para os locais de linha e coluna
df.iat[2, 5]
'FL'