Obtener el índice de una fila de un dataframe de pandas como un entero

Supongamos un dataframe fácil, por ejemplo

AB 0 1 0.810743 1 2 0.595866 2 3 0.154888 3 4 0.472721 4 5 0.894525 5 6 0.978174 6 7 0.859449 7 8 0.541247 8 9 0.232302 9 10 0.276566 

¿Cómo puedo recuperar un valor de índice de una fila, dada una condición? Por ejemplo: dfb = df[df['A']==5].index.values.astype(int) devuelve [4] , pero lo que me gustaría obtener es solo 4 . Esto me está causando problemas más adelante en el código.

Basado en algunas condiciones, quiero tener un registro de los índices donde se cumple esa condición, y luego seleccionar filas entre.

Lo intenté

 dfb = df[df['A']==5].index.values.astype(int) dfbb = df[df['A']==8].index.values.astype(int) df.loc[dfb:dfbb,'B'] 

para una salida deseada

  AB 4 5 0.894525 5 6 0.978174 6 7 0.859449 

pero obtengo TypeError: '[4]' is an invalid key

Lo más fácil es agregar [0] : seleccione el primer valor de la lista con un elemento:

 dfb = df[df['A']==5].index.values.astype(int)[0] dfbb = df[df['A']==8].index.values.astype(int)[0] 

 dfb = int(df[df['A']==5].index[0]) dfbb = int(df[df['A']==8].index[0]) 

Entonces parece que hay que restar 1 :

 print (df.loc[dfb:dfbb-1,'B']) 4 0.894525 5 0.978174 6 0.859449 Name: B, dtype: float64 

Otra solución con boolean indexing o query :

 print (df[(df['A'] >= 5) & (df['A'] < 8)]) AB 4 5 0.894525 5 6 0.978174 6 7 0.859449 print (df.loc[(df['A'] >= 5) & (df['A'] < 8), 'B']) 4 0.894525 5 0.978174 6 0.859449 Name: B, dtype: float64 

 print (df.query('A >= 5 and A < 8')) AB 4 5 0.894525 5 6 0.978174 6 7 0.859449 

Para responder a la pregunta original sobre cómo obtener el índice como un entero para la selección deseada, funcionará lo siguiente:

 df[df['A']==5].index.item() 

La naturaleza de querer incluir la fila donde A == 5 y todas las filas hasta, pero sin incluir la fila, donde A == 8 significa que terminaremos usando iloc ( loc incluye ambos extremos del sector).

Para obtener las tags de índice usamos idxmax . Esto devolverá la primera posición del valor máximo. Ejecuto esto en una serie booleana donde A == 5 (luego cuando A == 8 ) que devuelve el valor de índice cuando A == 5 ocurre primero (lo mismo para A == 8 ).

Luego uso searchsorted para encontrar la posición ordinal donde se encuentra la etiqueta de índice (que encontré arriba). Esto es lo que uso en iloc .

 i5, i8 = df.index.searchsorted([df.A.eq(5).idxmax(), df.A.eq(8).idxmax()]) df.iloc[i5:i8] 

introduzca la descripción de la imagen aquí


adormecido

puede mejorar aún más esto utilizando los objetos numpy subyacentes y las funciones numpy análogas. Lo envolví en una función práctica.

 def find_between(df, col, v1, v2): vals = df[col].values mx1, mx2 = (vals == v1).argmax(), (vals == v2).argmax() idx = df.index.values i1, i2 = idx.searchsorted([mx1, mx2]) return df.iloc[i1:i2] find_between(df, 'A', 5, 8) 

introduzca la descripción de la imagen aquí


sincronización
introduzca la descripción de la imagen aquí