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

5 minutos de lectura

avatar de usuario
abhi

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

Básicamente, en lugar de generar una excepción, me gustaría obtener True o False para ver si existe un valor en pandas df índice.

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 funcionando ahora es lo siguiente

sum(df.index == 'g')

  • ¿Qué pasa con any(df.index == ‘g’) ?

    – lufe

    8 mayo 2014 a las 18:13

Esto debería funcionar

'g' in df.index

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

    – MaximG

    16/10/2014 a las 17:59

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

    – joris

    30/07/2015 a las 15:40

  • También funciona para múltiples índices. Si su índice tiene longitud nentonces una tupla de cualquier longitud desde 1..n se puede comprobar

    – Minh Triet

    5 de marzo de 2018 a las 10:26

  • Para otros que vienen aquí, es posible que deba usar 'g' in df.columns si 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

    22 de junio de 2018 a las 14:54


  • ¿Es este tiempo constante o lineal?

    – Lokesh

    23 de noviembre de 2018 a las 11:00

avatar de usuario
brócoli2000

El índice múltiple funciona un poco diferente del índice único. Aquí hay algunos métodos para el marco de datos de múltiples índices.

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

Controlar df.index.levels para otros niveles.

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

Registrarse df.index para una tupla de combinación de índices.

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

avatar de usuario
Ezequiel Kruglick

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 out hace que las verificaciones existentes o “in” se ejecuten sin problemas con las otras herramientas de python. Solo pensé en tirar eso por ahí para la gente.

  • pero AttributeError: el objeto ‘DataFrame’ no tiene atributo ‘field’

    – emboscada

    30 de julio de 2015 a las 14:13

  • Hola Ganck. Se suponía que el “campo” mostraría 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 reemplazar “campo” con un campo real que está disponible 🙂 Supongo que podría ser más claro…

    – Ezequiel Kruglick

    30 de julio de 2015 a las 16:15

  • Esto fue realmente útil para señalar. Tengo un caso jerárquico donde in g in df.index produce verdadero y in g in df.index.values falso. Interesante.

    – watsonic

    21/09/2015 a las 20:34

  • @watsonic: un punto de precaución es ver si uno de esos está devolviendo tuplas debido a la jerarquía. Asegúrese de mirar lo que ambos están publicando (por ejemplo, en ipython o en la línea de comando) para asegurarse de que comprende con qué se está comparando. Otra cosa que puede hacer con los índices jerárquicos es df.index.get_level_values() para que las cosas sean más comprensibles, dependiendo de su aplicación, por supuesto.

    – Ezequiel Kruglick

    21/09/2015 a las 20:40

  • Esto aumentará considerablemente el tiempo de búsqueda, porque en lugar de usar el indexador de búsqueda optimizado de pandas, está recorriendo una lista. Disculpas por formatear, python data = [{'a': random.random(), 'b': random.randint(0, 10), 'c': i} for i in range(10000)] data2 = [{'a': random.random(), 'b': random.randint(0, 10), 'c': i} for i in range(100)] df1 = pd.DataFrame.from_records(data) df2 = pd.DataFrame.from_records(data2) timeit 99999 in df2.index # 442ns timeit 99999 in df1.index # 476ns timeit 99999 in df2.index.values # 3310ns timeit 99999 in df1.index.values # 63900ns

    – S.G.

    11 oct 2021 a las 11:05


avatar de usuario
xxijoel

El siguiente código no se imprime booleano, pero permite subconjuntos de tramas 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 subdividir 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)]

con marco de datos: 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

  • isin no verificará el dtype. df['value'].isin([True]).any() prueba esto, también te dará True, porque coincide con 1. True -> 1.

    – Mohamed Thasin ah

    22 de marzo de 2019 a las 8:23

avatar de usuario
Guillaume Jacquenot

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

  • isin no verificará el dtype. df['value'].isin([True]).any() prueba esto, también te dará True, porque coincide con 1. True -> 1.

    – Mohamed Thasin ah

    22 de marzo de 2019 a las 8:23

Me gusta usar:

if 'value' in df.index.get_level_values(0):
    print(True)

obtener_valores_de_nivel El método es bueno porque le permite obtener el valor en los índices sin importar si su índice es simple o compuesto.

Use 0 (cero) si tiene un solo índice en su marco de datos [or you want to check the first index in multiple index levels]. Utilice 1 para el segundo índice, y así sucesivamente…

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad