tutorial tablas notebook index hacer from español empty data create como python indexing pandas

tablas - Python Pandas: obtenga el índice de filas cuya columna coincide con cierto valor



pandas python tutorial (2)

Dado un DataFrame con una columna "BoolCol", queremos encontrar los índices del DataFrame en el que los valores de "BoolCol" == True

Actualmente tengo la forma iterativa de hacerlo, que funciona a la perfección:

for i in range(100,3000): if df.iloc[i][''BoolCol'']== True: print i,df.iloc[i][''BoolCol'']

Pero esta no es la forma correcta de hacerlo del panda. Después de algunas investigaciones, actualmente estoy usando este código:

df[df[''BoolCol''] == True].index.tolist()

Éste me da una lista de índices, pero no coinciden, cuando los reviso haciendo:

df.iloc[i][''BoolCol'']

¡El resultado es realmente falso!

¿Cuál sería la forma correcta de Pandas para hacer esto?


Se puede hacer usando la función numpy where ():

import pandas as pd import numpy as np In [716]: df = pd.DataFrame({"gene_name": [''SLC45A1'', ''NECAP2'', ''CLIC4'', ''ADC'', ''AGBL4''] , "BoolCol": [False, True, False, True, True] }, index=list("abcde")) In [717]: df Out[717]: BoolCol gene_name a False SLC45A1 b True NECAP2 c False CLIC4 d True ADC e True AGBL4 In [718]: np.where(df["BoolCol"] == True) Out[718]: (array([1, 3, 4]),) In [719]: select_indices = list(np.where(df["BoolCol"] == True)[0]) In [720]: df.iloc[select_indices] Out[720]: BoolCol gene_name b True NECAP2 d True ADC e True AGBL4

Aunque no siempre necesitas el índice para una coincidencia, pero en el caso de que necesites:

In [796]: df.iloc[select_indices].index Out[796]: Index([u''b'', u''d'', u''e''], dtype=''object'') In [797]: df.iloc[select_indices].index.tolist() Out[797]: [''b'', ''d'', ''e'']


df.iloc[i] devuelve la ith fila de df . No me refiero a la etiqueta índice, i es un índice basado en 0.

Por el contrario, el index atributos devuelve etiquetas de índice reales , no índices de filas numéricas:

df.index[df[''BoolCol''] == True].tolist()

o equivalente,

df.index[df[''BoolCol'']].tolist()

Puede ver la diferencia con bastante claridad al jugar con un DataFrame con un índice "inusual":

df = pd.DataFrame({''BoolCol'': [True, False, False, True, True]}, index=[10,20,30,40,50]) In [53]: df Out[53]: BoolCol 10 True 20 False 30 False 40 True 50 True [5 rows x 1 columns] In [54]: df.index[df[''BoolCol'']].tolist() Out[54]: [10, 40, 50]

Si quieres usar el índice ,

In [56]: idx = df.index[df[''BoolCol'']] In [57]: idx Out[57]: Int64Index([10, 40, 50], dtype=''int64'')

luego puede seleccionar las filas usando loc lugar de iloc :

In [58]: df.loc[idx] Out[58]: BoolCol 10 True 40 True 50 True [3 rows x 1 columns]

Tenga en cuenta que loc también puede aceptar matrices booleanas :

In [55]: df.loc[df[''BoolCol'']] Out[55]: BoolCol 10 True 40 True 50 True [3 rows x 1 columns]

Si tiene una matriz booleana, mask y necesita valores de índice ordinales, puede calcularlos usando np.flatnonzero :

In [110]: np.flatnonzero(df[''BoolCol'']) Out[112]: array([0, 3, 4])

Use df.iloc para seleccionar filas por índice ordinal:

In [113]: df.iloc[np.flatnonzero(df[''BoolCol''])] Out[113]: BoolCol 10 True 40 True 50 True