2012-10-22 20 views

risposta

117

Certo, è possibile utilizzare .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 onesti non mi capita spesso bisogno di questo me stesso. 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 si desidera il numero di indice. soluzione

+1

Il numero di colonna è utile quando si utilizza l'operatore '.iloc', in cui è necessario passare solo numeri interi per righe e colonne. – abe

+1

Oppure quando si utilizzano librerie che desiderano convertire il DF in una matrice numpy e indici di colonne con caratteristiche particolari. Ad esempio CatBoost vuole una lista di indici di caratteristiche categoriali. –

+0

Ho avuto bisogno di questo quando aggiungo la formattazione condizionale dopo aver creato fogli di lavoro con ExcelWriter. Ho bisogno di fare riferimento a colonne (e celle) dalle loro coordinate di Excel. – Alejandro

9

del DSM funziona, ma se si voleva un equivalente diretto per which si poteva fare (df.columns == name).nonzero()

+0

Ha senso. Grazie! – ak3nat0n

3

Quando si potrebbe essere alla ricerca per trovare la colonna più corrispondenze, potrebbe essere utilizzata una soluzione vectorized utilizzando searchsorted method. Così, con df come dataframe e query_cols come i nomi delle colonne da ricercare, 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)] 

Campione run -

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

Ecco una soluzione attraverso di lista. cols è l'elenco delle colonne per ottenere indice per:

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

Poiché 'cols' ha meno elementi di' df.columns', facendo 'per c in cols se c in df' sarebbe più veloce. – EOL

0

Nel caso in cui si desidera che il nome della colonna dalla posizione della colonna (il contrario dalla questione OP), è possibile utilizzare:

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

Utilizzo @DSM Esempio:

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

altro modo:

df.iloc[:,1].name 
Problemi correlati