2014-07-23 16 views
6

Ho un set di file delimitati da tabulazioni che devo leggere, li uso come dataframe panda, eseguo su di essi un intero gruppo di operazioni e li unisco a un file excel, il codice è troppo lungo così ho intenzione di passare attraverso la parte problematica di essoe profondità di lexsort MultiIndex

I file scheda che sto parsing contiene tutte lo stesso numero di righe 2177

Quando ho letto questi file mi indicizzazione da parte del prime 2 colonne di tipo (stringa, int)

df = df.set_index(['id', 'coord']) 
data = OrderedDict() 
#data will contain all the information I am writing to excel 
data[filename_id] = df 

one o f procedure sto facendo esigenze accedere a ciascuna riga di dati [ID Campione] che contiene dataframe di tipi misti indicizzati con le colonne 'id' e 'Coord', simili

sample_row = data[sample].ix[index] 

mio indice essendo ('id' , 'coord')

Se io sto curando un sottoinsieme del file tutto funziona grande, ma se leggo l'intero file con 2177 linee finisco per avere questo messaggio di errore

KeyError: 'Key length (2) was greater than MultiIndex lexsort depth (0)' 

ho cercato su SO e ovunque e sembra che questo è un problema di ordinare l'indice, ma non capisco perché noi un sottoinsieme non ordinato non causa il problema

Qualche idea su come posso risolvere questo problema?

Grazie

risposta

5

I documenti sono abbastanza buoni. Se si lavora con il multi-indici vale la pena di leggerli attraverso, vedere here

In [9]: df = DataFrame(np.arange(9).reshape(-1,1),columns=['value'],index=pd.MultiIndex.from_product([[1,2,3],['a','b','c']],names=['one','two'])) 

In [10]: df 
Out[10]: 
     value 
one two  
1 a  0 
    b  1 
    c  2 
2 a  3 
    b  4 
    c  5 
3 a  6 
    b  7 
    c  8 

In [11]: df.index.lexsort_depth 
Out[11]: 2 

In [12]: df.sortlevel(level=1) 
Out[12]: 
     value 
one two  
1 a  0 
2 a  3 
3 a  6 
1 b  1 
2 b  4 
3 b  7 
1 c  2 
2 c  5 
3 c  8 

In [13]: df.sortlevel(level=1).index.lexsort_depth 
Out[13]: 0 

In [9]: df = DataFrame(np.arange(9).reshape(-1,1),columns=['value'],index=pd.MultiIndex.from_product([[1,2,3],['a','b','c']],names=['one','two'])) 

In [10]: df 
Out[10]: 
     value 
one two  
1 a  0 
    b  1 
    c  2 
2 a  3 
    b  4 
    c  5 
3 a  6 
    b  7 
    c  8 

In [11]: df.index.lexsort_depth 
Out[11]: 2 

In [12]: df.sortlevel(level=1) 
Out[12]: 
     value 
one two  
1 a  0 
2 a  3 
3 a  6 
1 b  1 
2 b  4 
3 b  7 
1 c  2 
2 c  5 
3 c  8 

In [13]: df.sortlevel(level=1).index.lexsort_depth 
Out[13]: 0 

Aggiornamento (più volte!):

sortlevel diventerà obsoleto in modo da utilizzare sort_index cioè

df.sort_index(level=1) 
+0

Grazie Jeff, beh lo so e leggo il documento ma il problema è che sta accadendo solo per dataframe più grande di 1000 righe che trovo strano! – Rad

+4

Ho risolto il mio problema semplicemente facendo sort_index() – Rad

+0

Il collegamento a quell'ancora specifica per i documenti non funziona più, potresti fare riferimento a [questo] (http://pandas.pydata.org/pandas-docs/ stable/indexing.html # slicing-with-labels). – Akronix

Problemi correlati