2016-06-11 11 views
5

Mi sono imbattuto in uno strano risultato mentre giocavo con Pandas e non sono sicuro del perché questo avrebbe funzionato in questo modo. Mi chiedo se è un bug.Panda - Categoria variabile e raggruppa per - è un bug?

cf = pd.DataFrame({'sc': ['b' , 'b', 'c' , 'd'], 'nn': [1, 2, 3, 4], 'mvl':[10, 20, 30, 40]}) 
df = cf.groupby('sc').mean() 
df.loc['b', 'mvl'] 

Questo dà "15,0" come risultato.

cf1 = cf 
cf1['sc'] = cf1['sc'].astype('category', categories=['b', 'c', 'd'], ordered = True) 
df1 = cf1.groupby('sc').mean() 
df1.loc['b','mvl'] 

Questo dà come risultato una Serie:

sc 

b 15.0 
Name: mvl, dtype: float64 

type(df1.loc['b','mvl']) ->pandas.core.series.Series

type(df.loc['b','mvl']) ->numpy.float64

Perché sarebbe dichiarare la variabile come cambiamento categorica l'uscita del loc da uno scalare ad una serie?

Spero non sia una domanda stupida. Grazie!

+0

Versione corrente '0.18.1', ottengo' 15.0' di 'numpy.float64' restituito per entrambi i casi. – tmthydvnprt

+1

Sono in esecuzione 0.18.0, pensavo di eseguire l'ultima versione. Grazie mille per il controllo con 0.18.1, aggiornerò e rimuoverò la brutta correzione che ho dovuto aggiungere per rendere il comportamento coerente. – Luk17

risposta

3

Questo potrebbe essere un errore di panda. La differenza è dovuta al fatto che quando si raggruppa su una variabile categoriale, si ottiene un indice categoriale. Lo si può vedere più semplicemente senza alcuna groupby:

nocat = pandas.Series(['a', 'b', 'c']) 
cat = nocat.astype('category', categories=['a', 'b', 'c'], ordered=True) 
xno = pandas.Series([8, 88, 888], index=nocat) 
xcat = pandas.Series([8, 88, 888], index=cat) 

>>> xno.loc['a'] 
8 
>>> xcat.loc['a'] 
a 8 
dtype: int64 

Il docs nota che le operazioni di indicizzazione in un CategoricalIndex preservare l'indice categorica. Sembra che lo facciano anche se ottieni solo un risultato, il che non contraddice esattamente i documenti ma sembra un comportamento indesiderato.

C'è a related pull request che sembra risolvere questo comportamento, ma è stato unito solo di recente. Sembra che la correzione dovrebbe essere in panda 0.18.1.

+0

questo errore è stato risolto in 0.18.1 come indicato nel PR – Jeff

+0

Potenzialmente contraddice i documenti qui dove implica che una serie deve essere restituita quando si affetta usando 'loc'. http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics – Alexander