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.