2015-02-26 11 views
10

Dire df è un dataframe panda.Indicizzazione dei frame di dati di Pandas: righe intere, colonne con nome

  • df.loc[] accetta solo nomi
  • df.iloc[] accetta solo numeri interi (tirocini effettivi)
  • df.ix[] accetta entrambi nomi e numeri interi:

Quando si fa riferimento filari, df.ix[row_idx, ] vuole solo essere dato un nome. per esempio.

df = pd.DataFrame({'a' : ['one', 'two', 'three','four', 'five', 'six'], 
        '1' : np.arange(6)}) 
df = df.ix[2:6] 
print(df) 

    1  a 
2 2 three 
3 3 four 
4 4 five 
5 5 six 

df.ix[0, 'a'] 

genera un errore, non restituisce "due".

Quando si fa riferimento alle colonne, iloc è preferisce numeri interi, non nomi. per esempio.

df.ix[2, 1] 

ritorna 'tre', non 2. (Anche se df.idx[2, '1'] fa ritorno 2).

Stranamente, mi piacerebbe la funzionalità esattamente opposta. Solitamente i nomi delle mie colonne sono molto significativi, quindi nel mio codice li faccio riferimento direttamente. Ma a causa dell'elevata pulizia dell'osservazione, i nomi delle righe nei frame dei miei panda di solito non corrispondono a range(len(df)).

mi rendo conto che posso usare:

df.iloc[0].loc['a'] # returns three 

ma sembra brutto! Qualcuno sa di un modo migliore per farlo, in modo che il codice sarebbe simile a questo?

df.foo[0, 'a'] # returns three 

In realtà, è possibile aggiungere sul mio nuovo metodo per pandas.core.frame.DataFrame s, così per esempio df.idx(rows, cols) è infatti df.iloc[rows].loc[cols]?

+1

Si potrebbe usare 'df ['a']. Iloc [0]'. – unutbu

+6

Vedere anche [GH 9213] (https://github.com/pydata/pandas/issues/9213#issuecomment-72076683), che suggerisce 'df.loc [df.index [0], 'a']'. Questo ha il [vantaggio di non usare l'indicizzazione concatenata] (http://pandas.pydata.org/pandas-docs/stable/indexing.html#why-does-the-assignment-when-using-chained-indexing-fail) , il che significa che funzionerà quando si eseguono assegnazioni, mentre 'df [['a', 'b']]. iloc [0] = val' non lo farebbe. – unutbu

+0

in realtà non risolve il tuo problema, ma un'ottima risposta qui: https://stackoverflow.com/questions/31593201/pandas-iloc-vs-ix-locslloc-explanation – JohnE

risposta

8

È una risposta tardiva, ma il commento di @ unutbu è ancora valido e un'ottima soluzione a questo problema.

Per indicizzare una dataframe con righe e colonne interi denominate (colonne etichettate):

df.loc[df.index[#], 'NAME'] dove # è un indice intero valido e NAME è il nome della colonna.

+0

Sembra molto lento su dataframes lunghi. – ConanG

Problemi correlati