Verifique se existe um valor no índice de dataframe do pandas


139

Estou certo de que existe uma maneira óbvia de fazer isso, mas não consigo pensar em nada liso no momento.

Basicamente, em vez de gerar exceção, gostaria de obter Trueou Falsever se existe um valor no dfíndice de pandas .

import pandas as pd
df = pd.DataFrame({'test':[1,2,3,4]}, index=['a','b','c','d'])
df.loc['g']  # (should give False)

O que eu tenho trabalhando agora é o seguinte

sum(df.index == 'g')

1
E quanto a qualquer (df.index == 'g')?
luffe 8/05

Respostas:


252

Isso deve fazer o truque

'g' in df.index

7
Isso parece não funcionar quando várias entradas compartilham os mesmos valores de índice.
MaximG

2
@MaximG O que você quer dizer? Isso funciona para um índice não exclusivo também.
Joris

Também trabalha para multi-índice. Se o seu índice tem comprimento n, em seguida, uma tupla de qualquer comprimento de 1..npode ser verificado
Minh Triet

2
Para outros vir aqui, pode ser necessário o uso 'g' in df.columnsse sua trama de dados foi definida com títulos de coluna em vez de um índice, por exemplo:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Tahlor

2
Isso é tempo constante ou linear?
Lokesh

36

Apenas para referência, como era algo que eu estava procurando, você pode testar a presença nos valores ou no índice anexando o método ".values", por exemplo

g in df.<your selected field>.values
g in df.index.values

Acho que a adição de ".values" para obter uma lista simples ou o ndarray faz existir ou as verificações "in" são executadas de maneira mais suave com as outras ferramentas python. Só pensei em jogar isso lá fora para as pessoas.


mas AttributeError: objeto 'trama de dados' não tem 'field' atributo
Gank

1
Oi Gank. O "campo" deveria mostrar que você pode aplicar o método ".values" a vários campos do quadro de dados, como colunas ou uma coluna selecionada. ".index" é um exemplo de substituição de 'campo' com um campo real que está disponível :) Eu acho que poderia ser mais claro ...
Ezequiel Kruglick

2
Isso foi realmente útil de salientar. Eu tenho um caso hierárquico em que in g in df.indexproduz verdadeiro e in g in df.index.valuesfalso. Interessante.
watsonic

@ watsonic - um ponto de cuidado para verificar se um deles está retornando tuplas devido à hierarquia. Certifique-se de examinar o que os dois estão publicando (por exemplo, no ipython ou na linha de comando) para entender o que você está comparando. Outra coisa que você pode fazer com índices hierárquicos é df.index.get_level_values ​​(<nome do nível>) para tornar as coisas mais compreensíveis - dependendo da sua aplicação, é claro.
Ez Kruglick

28

O índice múltiplo funciona um pouco diferente do índice único. Aqui estão alguns métodos para o quadro de dados multi-indexado.

df = pd.DataFrame({'col1': ['a', 'b','c', 'd'], 'col2': ['X','X','Y', 'Y'], 'col3': [1, 2, 3, 4]}, columns=['col1', 'col2', 'col3'])
df = df.set_index(['col1', 'col2'])

in df.index funciona para o primeiro nível somente ao verificar o valor do índice único.

'a' in df.index     # True
'X' in df.index     # False

Verifique df.index.levelsoutros níveis.

'a' in df.index.levels[0] # True
'X' in df.index.levels[1] # True

Faça check-in df.indexpara uma tupla de combinação de índice.

('a', 'X') in df.index  # True
('a', 'Y') in df.index  # False

2

com DataFrame: df_data

>>> df_data
  id   name  value
0  a  ampha      1
1  b   beta      2
2  c     ce      3

Eu tentei:

>>> getattr(df_data, 'value').isin([1]).any()
True
>>> getattr(df_data, 'value').isin(['1']).any()
True

mas:

>>> 1 in getattr(df_data, 'value')
True
>>> '1' in getattr(df_data, 'value')
False

Tão divertido: D


isinnão verificará o dtype. df['value'].isin([True]).any()tente isso, também lhe dará True, porque combina com 1. True -> 1.
Mohamed Thasin ah 22/03/19

1
df = pandas.DataFrame({'g':[1]}, index=['isStop'])

#df.loc['g']

if 'g' in df.index:
    print("find g")

if 'isStop' in df.index:
    print("find a") 

O que é o isStop?
Nabin

1

O código abaixo não imprime booleano, mas permite o subconjunto de quadros de dados por índice ... Entendo que essa provavelmente não é a maneira mais eficiente de resolver o problema, mas eu (1) gosto da maneira como lê e (2) você pode facilmente subconectar onde o índice df1 existe no df2:

df3 = df1[df1.index.isin(df2.index)]

ou onde o índice df1 não existe no df2 ...

df3 = df1[~df1.index.isin(df2.index)]
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.