Obtener el índice de la columna del nombre de la columna en pandas de Python

220

En R, cuando necesita recuperar un índice de columna basado en el nombre de la columna, puede hacer

idx <- which(names(my_data)==my_colum_name)

¿Hay alguna manera de hacer lo mismo con los marcos de datos de pandas?

ak3nat0n
fuente

Respuestas:

359

Claro, puedes usar .get_loc():

In [45]: df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})

In [46]: df.columns
Out[46]: Index([apple, orange, pear], dtype=object)

In [47]: df.columns.get_loc("pear")
Out[47]: 2

aunque para ser honesto, a menudo no lo necesito. Por lo general, el acceso por nombre hace lo que quiero ( df["pear"], df[["apple", "orange"]]o tal vez df.columns.isin(["orange", "pear"])), aunque definitivamente puedo ver casos en los que desea el número de índice.

DSM
fuente
77
El número de columna es útil cuando se utiliza el .ilocoperador, donde solo debe pasar enteros para las filas y las columnas.
abe
44
O cuando se usan bibliotecas que desean que el DF se convierta en una matriz numpy e índices de columnas con características particulares. Por ejemplo, CatBoost quiere una lista de índices de características categóricas.
Tom Walker
1
Necesitaba esto al agregar formato condicional después de crear hojas de trabajo con ExcelWriter. Necesito referirme a las columnas (y celdas) por sus coordenadas de Excel.
Alejandro
Lo uso cuando hago una variedad de subtramas. Una subtrama de los datos en cada columna.
David Collins el
2
Lo uso cuando quiero insertuna nueva columna después de una columna existente.
Amir A. Shabani
33

Aquí hay una solución a través de la comprensión de la lista. cols es la lista de columnas para obtener el índice:

[df.columns.get_loc(c) for c in cols if c in df]
snovik
fuente
44
Como colstiene menos elementos que df.columns, hacer for c in cols if c in dfsería más rápido.
Eric O Lebigot
15

La solución de DSM funciona, pero si quisiera un equivalente directo a whichusted podría hacerlo(df.columns == name).nonzero()

Wes McKinney
fuente
10

Cuando esté buscando encontrar múltiples coincidencias de columna, se podría usar una solución vectorizada usando el searchsortedmétodo . Por lo tanto, con dfel marco de datos y query_colslos nombres de columna a buscar, una implementación sería:

def column_index(df, query_cols):
    cols = df.columns.values
    sidx = np.argsort(cols)
    return sidx[np.searchsorted(cols,query_cols,sorter=sidx)]

Ejecución de muestra:

In [162]: df
Out[162]: 
   apple  banana  pear  orange  peach
0      8       3     4       4      2
1      4       4     3       0      1
2      1       2     6       8      1

In [163]: column_index(df, ['peach', 'banana', 'apple'])
Out[163]: array([4, 1, 0])
Divakar
fuente
8

En caso de que desee el nombre de la columna desde la ubicación de la columna (al revés de la pregunta OP), puede usar:

>>> df.columns.get_values()[location]

Usando @DSM Ejemplo:

>>> df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})

>>> df.columns

Index(['apple', 'orange', 'pear'], dtype='object')

>>> df.columns.get_values()[1]

'orange'

Otras maneras:

df.iloc[:,1].name

df.columns[location] #(thanks to @roobie-nuby for pointing that out in comments.) 
salhin
fuente
2
¿Por qué no solo df.columns[location]?
Roobie Nuby
1

Qué tal esto:

df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})
out = np.argwhere(df.columns.isin(['apple', 'orange'])).ravel()
print(out)
[1 2]
Siraj S.
fuente