Ottieni l'indice di colonna dal nome della colonna nei panda python


220

In R quando è necessario recuperare un indice di colonna in base al nome della colonna che è possibile eseguire

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

C'è un modo per fare lo stesso con i frame di dati Panda?

Risposte:


360

Certo, puoi usare .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

anche se ad essere sincero, spesso non ne ho bisogno. Di solito l'accesso per nome fa quello che voglio ( df["pear"], df[["apple", "orange"]]o forse df.columns.isin(["orange", "pear"])), anche se posso sicuramente vedere i casi in cui vorresti il ​​numero di indice.


7
Il numero di colonna è utile quando si utilizza l' .ilocoperatore, in cui è necessario passare solo numeri interi sia per le righe che per le colonne.
Abe

4
O quando si usano librerie che vogliono convertire il DF in una matrice numpy e indici di colonne con caratteristiche particolari. Ad esempio CatBoost vuole un elenco di indici di caratteristiche categoriche.
Tom Walker,

1
Ne avevo bisogno quando ho aggiunto la formattazione condizionale dopo aver creato fogli di lavoro con ExcelWriter. Devo fare riferimento alle colonne (e alle celle) in base alle loro coordinate Excel.
Alejandro,

Lo uso quando faccio una matrice di sottotrame. Una sottotrama dai dati in ogni colonna.
David Collins,

2
Lo uso quando voglio insertuna nuova colonna dopo una colonna esistente.
Amir A. Shabani,

33

Ecco una soluzione attraverso la comprensione dell'elenco. cols è l'elenco di colonne per ottenere l'indice per:

[df.columns.get_loc(c) for c in cols if c in df]

4
Dal momento che colsha meno elementi rispetto a df.columns, fare for c in cols if c in dfsarebbe più veloce.
Eric O Lebigot,

15

La soluzione di DSM funziona, ma se volessi un equivalente diretto a whichte potresti farlo(df.columns == name).nonzero()


10

Quando si sta cercando di trovare più corrispondenze di colonne, è possibile utilizzare una soluzione vettoriale utilizzando il searchsortedmetodo . Pertanto, con dfcome il frame di dati e query_colscome i nomi delle colonne da cercare, un'implementazione sarebbe:

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

Esecuzione campione -

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

Nel caso in cui si desideri il nome della colonna dalla posizione della colonna (viceversa alla domanda OP), è possibile utilizzare:

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

Utilizzando l'esempio @DSM:

>>> 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'

Altri modi:

df.iloc[:,1].name

df.columns[location] #(thanks to @roobie-nuby for pointing that out in comments.) 

2
Perché non solo df.columns[location]?
Roobie Nuby,

1

cosa ne pensi di questo:

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]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.