Recentemente, comecei a ramificar do meu lugar seguro (R) para o Python e estou um pouco confuso com a localização / seleção de células no Pandas
. Eu li a documentação, mas estou lutando para entender as implicações práticas das várias opções de localização / seleção.
- Existe uma razão pela qual eu deveria usar
.loc
ou.iloc
sobre a opção mais geral.ix
? - Eu entendo que
.loc
,iloc
,at
, eiat
pode fornecer alguma correção a garantia de que.ix
não pode oferecer, mas eu também li que.ix
tende a ser a solução mais rápida através da placa. - Explique o raciocínio das melhores práticas do mundo real por trás da utilização de algo que não seja
.ix
?
loc
é uma indexação baseada em rótulo; portanto, basicamente, procurar um valor em uma linha,iloc
é uma indexação baseada em linha inteira,ix
é um método geral que primeiro executa com base em rótulo; se isso falhar, ele passará a ser baseado em número inteiro.at
está obsoleto e é recomendável que você não use mais isso. A outra coisa a considerar é o que você está tentando fazer, pois alguns desses métodos permitem fatiar e atribuir colunas, para ser honesto, os documentos são bem claros: pandas.pydata.org/pandas-docs/stable/indexing.htmlat
está obsoleto? Não o vejo nos documentos at (ou iat ).loc
,ix
eiloc
aqui: stackoverflow.com/questions/31593201/...Respostas:
loc: trabalhe apenas no índice
iloc: trabalhe na posição
ix: você pode obter dados do dataframe sem que estejam no índice
em: obter valores escalares. É um local muito rápido
: obtenha valores escalares. É um iloc muito rápido
http://pyciencia.blogspot.com/2015/05/obtener-y-filtrar-datos-de-un-dataframe.html
Nota: A partir de
pandas 0.20.0
, o.ix
indexador foi descontinuado em favor dos mais rigorosos.iloc
e.loc
indexadores.fonte
at
eiat
são versões muito rápidas deloc
eiloc
, em seguida, por que usarloc
eiloc
em tudo?at
eoiat
um destinado a aceder a um escalar, isto é, um único elemento da trama de dados, ao mesmo tempoloc
eiloc
são mentos para aceder a vários elementos ao mesmo tempo, potencialmente, para executar operações vectorized.Atualizado por
pandas
0.20
causa deix
descontinuação. Isso demonstra não apenas como usarloc
,iloc
,at
,iat
,set_value
, mas como realizar, a indexação com base posicional / label mista.loc
- baseado em etiquetaPermite passar matrizes 1-D como indexadores. As matrizes podem ser fatias (subconjuntos) do índice ou coluna, ou podem ser matrizes booleanas com comprimento igual ao índice ou colunas.
Nota especial: quando um indexador escalar é passado, é
loc
possível atribuir um novo índice ou valor de coluna que não existia antes.iloc
- baseado em posiçãoSimilar a
loc
exceto com posições em vez dos valores de índice. No entanto, você não pode atribuir novas colunas ou índices.at
- baseado em etiquetaFunciona muito semelhante ao
loc
dos indexadores escalares. Não pode operar em indexadores de matriz. Lata! atribua novos índices e colunas.Vantagem sobre
loc
é que este é mais rápido.A desvantagem é que você não pode usar matrizes para indexadores.
iat
- baseado em posiçãoFunciona de maneira semelhante a
iloc
. Não é possível trabalhar em indexadores de matriz. Não podes! atribua novos índices e colunas.Vantagem sobre
iloc
é que este é mais rápido.A desvantagem é que você não pode usar matrizes para indexadores.
set_value
- baseado em etiquetaFunciona muito semelhante ao
loc
dos indexadores escalares. Não pode operar em indexadores de matriz. Lata! atribuir novos índices e colunasVantagem Super rápido, porque há muito pouca sobrecarga!
Desvantagem Há muito pouca sobrecarga porque
pandas
não está realizando muitas verificações de segurança. Use por sua conta e risco . Além disso, isso não se destina ao uso público.set_value
comtakable=True
- posição com basefunciona de forma semelhante a
iloc
. Não é possível trabalhar em indexadores de matriz. Não podes! atribua novos índices e colunas.Vantagem Super rápido, porque há muito pouca sobrecarga!
Desvantagem Há muito pouca sobrecarga porque
pandas
não está realizando muitas verificações de segurança. Use por sua conta e risco . Além disso, isso não se destina ao uso público.fonte
set_value
foi preterido em favor de.at
e.iat
desde a versão 0.21Há duas maneiras principais pelas quais os pandas fazem seleções em um DataFrame.
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 inteiraEu 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 inteiroAlé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 abaixoVamos 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:Todas as palavras em negrito são os rótulos. As etiquetas,
age
,color
,food
,height
,score
estate
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ãoSelecionando 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
.Isso retorna a linha de dados como uma série
Selecionando várias linhas com .loc com uma lista de cadeias
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.
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ãoSelecionando uma única linha com .iloc com um número inteiro
Isso retorna a 5ª linha (local inteiro 4) como uma Série
Selecionando várias linhas com .iloc com uma lista de números inteiros
Isso retorna um DataFrame da terceira e da segunda à última linhas:
Selecionando várias linhas com .iloc com notação de fatia
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:
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.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:Ou, alternativamente, converta os rótulos de índice em números inteiros com o
get_loc
método index.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
escore
, podemos fazer o seguinte: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: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: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.
O uso de uma lista seleciona várias colunas
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.
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.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.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 colunafonte
fonte
Vamos começar com este pequeno df:
Nós vamos ter
Com isso, temos:
Portanto, não podemos usar .iat para subconjunto, onde devemos usar apenas .iloc.
Mas vamos tentar ambos para selecionar um df maior e vamos verificar a velocidade ...
Portanto, com .loc, podemos gerenciar subconjuntos e com .at apenas um único escalar, mas .at é mais rápido que .loc
:-)
fonte