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?

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.


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]

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


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

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

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]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.