Selecione as linhas do Pandas com base no índice da lista

105

Eu tenho um dataframe df:

   20060930  10.103       NaN     10.103   7.981
   20061231  15.915       NaN     15.915  12.686
   20070331   3.196       NaN      3.196   2.710
   20070630   7.907       NaN      7.907   6.459

Então eu quero selecionar linhas com certos números de sequência indicados em uma lista, suponha que aqui seja [1,3], depois à esquerda:

   20061231  15.915       NaN     15.915  12.686
   20070630   7.907       NaN      7.907   6.459

Como ou qual função pode fazer isso?

user2806761
fonte

Respostas:

130
List = [1, 3]
df.ix[List]

deve fazer o truque! Quando indexo com frames de dados, sempre uso o método .ix (). É muito mais fácil e flexível ...

ATUALIZAÇÃO Este não é mais o método aceito para indexação. O ixmétodo está obsoleto. Use .ilocpara indexação baseada em inteiros e .locpara indexação baseada em rótulos.

Woody Pride
fonte
14
Isso agora está obsoleto, .iloc deve ser usado para indexação posicional
t_warsop
86

você também pode usar o iloc:

df.iloc[[1,3],:]

Isso não funcionará se os índices em seu dataframe não corresponderem à ordem das linhas devido a cálculos anteriores. Nesse caso, use:

df.index.isin([1,3])

... como sugerido em outras respostas.

yemu
fonte
61

Outra forma (embora seja um código mais longo), mas é mais rápido do que os códigos acima. Verifique usando a função% timeit:

df[df.index.isin([1,3])]

PS: Você descobre o motivo

insira a descrição da imagem aqui

Amruth Lakkavaram
fonte
1
usar df.index.get_level_values(0).isinpara multi
CiaranWelsh
4

Para grandes conjuntos de dados, é eficiente para a memória ler apenas as linhas selecionadas por meio do skiprowsparâmetro.

Exemplo

pred = lambda x: x not in [1, 3]
pd.read_csv("data.csv", skiprows=pred, index_col=0, names=...)

Isso agora retornará um DataFrame de um arquivo que ignora todas as linhas, exceto 1 e 3.


Detalhes

Dos documentos :

skiprows : semelhante a uma lista ou inteiro ou chamável, padrão None

...

Se chamável, a função chamável será avaliada em relação aos índices de linha, retornando True se a linha deve ser ignorada e False caso contrário. Um exemplo de um argumento válido que pode ser chamado serialambda x: x in [0, 2]

Este recurso funciona na versão pandas 0.20.0+. Veja também o problema correspondente e uma postagem relacionada .

pilang
fonte