Compruebe si existe un valor en el índice de marco de datos de pandas


139

Estoy seguro de que hay una manera obvia de hacer esto, pero no puedo pensar en nada resbaladizo en este momento.

Básicamente, en lugar de generar una excepción, me gustaría obtener Trueo Falsever si existe un valor en el 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)

Lo que tengo trabajando ahora es lo siguiente

sum(df.index == 'g')

1
¿Qué pasa con alguno (df.index == 'g')?
luffe

Respuestas:


252

Esto debería funcionar

'g' in df.index

77
Esto no parece funcionar cuando varias entradas comparten los mismos valores de índice.
MaximG

2
@MaximG ¿Qué quieres decir? Esto también funciona para un índice no único.
joris

También funciona para múltiples índices. Si su índice tiene longitud n, entonces 1..nse puede verificar una tupla de cualquier longitud
Minh Triet

2
Para otros que vienen aquí, es posible que deba usar 'g' in df.columnssi su marco de datos se definió con encabezados de columna en lugar de un índice, por ejemplo:df = pandas.DataFrame({'test':[1,2,3,4]}, columns=['a','b','c','d'])
Tahlor

2
¿Es este tiempo constante o lineal?
Lokesh el

36

Solo como referencia, ya que era algo que estaba buscando, puede probar la presencia dentro de los valores o el índice agregando el método ".values", por ejemplo

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

Encuentro que agregar los ".values" para obtener una lista simple o ndarray hace que existan o que las comprobaciones "in" se ejecuten más fácilmente con las otras herramientas de Python. Solo pensé en tirar eso a la gente.


pero AttributeError: el objeto 'DataFrame' no tiene atributo 'field'
Gank

1
Hola gank Se suponía que el "campo" debía mostrar que puede aplicar el método ".values" a varios campos del marco de datos, como columnas o una columna seleccionada. ".index" es un ejemplo de reemplazo de "campo" con un campo real que está disponible :) Creo que podría ser más claro ...
Ezekiel Kruglick

2
Esto fue realmente útil de señalar. Tengo un caso jerárquico donde in g in df.indexproduce verdadero y in g in df.index.valuesfalso. Interesante.
watsonic

@watsonic: un punto de precaución es ver si uno de ellos devuelve tuplas debido a la jerarquía Asegúrese de ver lo que ambos están publicando (por ejemplo, en ipython o en la línea de comandos) para asegurarse de comprender con qué se está comparando. Otra cosa que puede hacer con los índices jerárquicos es df.index.get_level_values ​​(<nombre de nivel>) para hacer las cosas más comprensibles, dependiendo de su aplicación, por supuesto.
Ezekiel Kruglick

28

El índice múltiple funciona un poco diferente del índice único. Aquí hay algunos métodos para el marco de datos 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 el primer nivel solo cuando se verifica un valor de índice único.

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

Verifica df.index.levelsotros niveles.

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

Regístrese df.indexpara obtener una tupla de combinación de índice.

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

2

con DataFrame: df_data

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

Lo intenté:

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

pero:

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

Muy divertido: D


isinno verificará el tipo de letra. df['value'].isin([True]).any()prueba esto, también te dará True, porque coincide con 1. True -> 1.
Mohamed Thasin ah

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") 

¿Qué es isStop?
Nabin

1

El siguiente código no imprime booleano, pero permite el subconjunto de marcos de datos por índice ... Entiendo que probablemente esta no sea la forma más eficiente de resolver el problema, pero (1) me gusta la forma en que se lee y (2) puede subconjunto fácilmente donde existe el índice df1 en df2:

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

o donde el índice df1 no existe en df2 ...

df3 = df1[~df1.index.isin(df2.index)]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.