Estou curioso para saber por que df[2]
não é suportado, enquanto df.ix[2]
e df[2:3]
ambos funcionam.
In [26]: df.ix[2]
Out[26]:
A 1.027680
B 1.514210
C -1.466963
D -0.162339
Name: 2000-01-03 00:00:00
In [27]: df[2:3]
Out[27]:
A B C D
2000-01-03 1.02768 1.51421 -1.466963 -0.162339
Eu esperaria df[2]
trabalhar da mesma maneira que df[2:3]
seja consistente com a convenção de indexação do Python. Existe um motivo de design para não oferecer suporte à linha de indexação por número inteiro único?
df.ix[2]
não funciona - pelo menos não empandas version '0.19.2'
[]
, veja esta resposta abaixo . Também NUNCA USE.ix
, ele está obsoletoRespostas:
ecoando @HYRY, veja os novos documentos em 0.11
http://pandas.pydata.org/pandas-docs/stable/indexing.html
Aqui temos novos operadores:
.iloc
explicitamente suportam apenas indexação inteira e.loc
explicitamente suportam apenas indexação de rótulopor exemplo, imagine esse cenário
[]
divide apenas as linhas (por localização do rótulo)fonte
iloc
são linhas eloc
rótulos..iloc
procura as coisas por ordem no índice (por exemplo.iloc[[2]]
) é a segunda "linha" emdf
. Essa linha está no local do índice4
..loc
procura-os pelo seu valor de índice. Então, talvez "iloc" seja como "i" como emA[i]
? :)df.loc[-1] = df.iloc[[0]]
, e inserir isso? O quadro vem com uma coluna de índice adicionada, que fornece erroValueError: cannot set a row with mismatched columns
(consulte stackoverflow.com/questions/47340571/… ) #O objetivo principal do operador de indexação DataFrame
[]
é selecionar colunas.Quando o operador de indexação recebe uma string ou um número inteiro, ele tenta encontrar uma coluna com esse nome específico e retorná-la como uma série.
Portanto, na pergunta acima:
df[2]
procura um nome de coluna que corresponda ao valor inteiro2
. Esta coluna não existe e aKeyError
é levantada.O operador de indexação DataFrame altera completamente o comportamento para selecionar linhas quando a notação de fatia é usada
Estranhamente, quando recebe uma fatia, o operador de indexação DataFrame seleciona linhas e pode fazê-lo por local inteiro ou por rótulo de índice.
Isso vai começar da linha com o local inteiro 2 até 3, exclusivo do último elemento. Então, apenas uma única linha. A seguir, são selecionadas linhas que começam no local inteiro 6, mas não incluem 20 por cada terceira linha.
Você também pode usar fatias que consistem em rótulos de cadeia, se o índice do DataFrame tiver cadeias. Para mais detalhes, consulte esta solução em .iloc vs .loc .
Eu quase nunca uso essa notação de fatia com o operador de indexação, pois ela não é explícita e quase nunca é usada. Ao fatiar por linhas, fique com
.loc/.iloc
.fonte
Você pode pensar no DataFrame como um ditado da série.
df[key]
tente selecionar o índice da colunakey
e retorne um objeto Series.No entanto, fatiar dentro de [] corta as linhas, porque é uma operação muito comum.
Você pode ler o documento para obter detalhes:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
fonte
Para acesso baseado em índice à tabela pandas, também é possível considerar a opção numpy.as_array para converter a tabela em array Numpy como
e depois
podia funcionar.
fonte
Você pode dar uma olhada no código fonte .
DataFrame
possui uma função privada_slice()
para fatiar oDataFrame
e permite que o parâmetroaxis
determine qual eixo fatiar. O__getitem__()
forDataFrame
não define o eixo ao invocar_slice()
. Portanto,_slice()
corte-o como eixo 0 padrão.Você pode fazer um experimento simples, que pode ajudá-lo:
fonte
você pode percorrer o quadro de dados como este.
fonte