Selecionando uma linha de séries de pandas / dataframe pelo índice inteiro


395

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?


4
df.ix[2]não funciona - pelo menos não empandas version '0.19.2'
Zahra

9
Para ver a diferença entre a seleção de linhas e colunas por meio do operador de indexação [], veja esta resposta abaixo . Também NUNCA USE .ix, ele está obsoleto
Ted Petrou

Respostas:


552

ecoando @HYRY, veja os novos documentos em 0.11

http://pandas.pydata.org/pandas-docs/stable/indexing.html

Aqui temos novos operadores: .ilocexplicitamente suportam apenas indexação inteira e .locexplicitamente suportam apenas indexação de rótulo

por exemplo, imagine esse cenário

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] divide apenas as linhas (por localização do rótulo)


7
E se você quisesse a segunda e a terceira e quarta linhas?
FaCoffee 7/11

11
você pode simplesmente passar uma lista de indexadores; Os documentos são apontados acima
Jeff

2
Alguém tem uma justificativa para esses nomes? Acho isso difícil de lembrar, porque não sei por que ilocsão linhas e locrótulos.
quilojoules

3
O @kilojoules .ilocprocura as coisas por ordem no índice (por exemplo .iloc[[2]]) é a segunda "linha" em df. Essa linha está no local do índice4 . .locprocura-os pelo seu valor de índice. Então, talvez "iloc" seja como "i" como em A[i]? :)
Jim K.

11
@ Jeff - isso funciona muito bem, mas o que acontece quando você deseja duplicar uma linha do seu quadro de dados, como df.loc[-1] = df.iloc[[0]], e inserir isso? O quadro vem com uma coluna de índice adicionada, que fornece erro ValueError: cannot set a row with mismatched columns (consulte stackoverflow.com/questions/47340571/… ) #
Growler

63

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 inteiro 2. Esta coluna não existe e a KeyErroré 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.

df[2:3]

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.

df[6:20:3]

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.


Tentando adicionar linhas a outro quadro de dados usando o operador indxeing, mas o outro quadro de dados permanece vazio. Por quê?
FindOutIslamNow

23

Você pode pensar no DataFrame como um ditado da série. df[key]tente selecionar o índice da coluna keye 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


Obrigado pela dica. Engraçado, esse tipo de coisa ainda faz perguntas aos pandas às vezes. Adicionando exceções ao comportamento em determinadas situações, .. para mim parece sacrificar a consistência por um pouco de conveniência.
Carl Berger

15

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

np_df = df.as_matrix()

e depois

np_df[i] 

podia funcionar.


11
que derrota o propósito dos índices dataframes e tudo o mais pandas ofertas
Fábio Dias

6

Você pode dar uma olhada no código fonte .

DataFramepossui uma função privada _slice()para fatiar o DataFramee permite que o parâmetro axisdetermine qual eixo fatiar. O __getitem__()for DataFramenã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:

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

5

você pode percorrer o quadro de dados como este.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.