Na minha opinião, a resposta aceita é confusa, pois usa um DataFrame com apenas valores ausentes. Também não gosto do termo baseado em posição.iloc
e prefiro local inteiro , pois é muito mais descritivo e exatamente o que .iloc
significa. A palavra-chave é INTEGER - .iloc
precisa de INTEGERS.
Veja minha série de blogs extremamente detalhada sobre seleção de subconjuntos para mais
.ix está obsoleto e ambíguo e nunca deve ser usado
Como .ix
está obsoleto, focaremos apenas 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 índice. 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 para o í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 do DataFrame.
Existem três entradas diferentes que você pode usar para .loc
- 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 é definido explicitamente, 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 três entradas diferentes que você pode usar para .iloc
- 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 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 maneira:
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 os 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 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 []
, também pode selecionar linhas e colunas, 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'