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')
Abhi
fuente
1
¿Qué pasa con alguno (df.index == 'g')?
luffe

Respuestas:

252

Esto debería funcionar

'g' in df.index
Guillaume Jacquenot
fuente
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.

Ezekiel Kruglick
fuente
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
brócoli2000
fuente
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

Quoc Chi
fuente
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") 
Gank
fuente
¿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)]
xxyjoel
fuente