2012-10-11 4 views
15

Ho un problema con qualche codice groupy di cui sono abbastanza sicuro una volta eseguito (su una versione di panda precedente). Su 0.9, ottengo Nessun tipo numerico per aggregare gli errori. Qualche idea?Nessun tipo numerico da aggregare: modifica del comportamento groupby()?

In [31]: data 
Out[31]: 
<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 2557 entries, 2004-01-01 00:00:00 to 2010-12-31 00:00:00 
Freq: <1 DateOffset> 
Columns: 360 entries, -89.75 to 89.75 
dtypes: object(360) 

In [32]: latedges = linspace(-90., 90., 73) 

In [33]: lats_new = linspace(-87.5, 87.5, 72) 

In [34]: def _get_gridbox_label(x, bins, labels): 
    ....:    return labels[searchsorted(bins, x) - 1] 
    ....: 

In [35]: lat_bucket = lambda x: _get_gridbox_label(x, latedges, lats_new) 

In [36]: data.T.groupby(lat_bucket).mean() 
--------------------------------------------------------------------------- 
DataError         Traceback (most recent call last) 
<ipython-input-36-ed9c538ac526> in <module>() 
----> 1 data.T.groupby(lat_bucket).mean() 

/usr/lib/python2.7/site-packages/pandas/core/groupby.py in mean(self) 
    295   """ 
    296   try: 
--> 297    return self._cython_agg_general('mean') 
    298   except DataError: 
    299    raise 

/usr/lib/python2.7/site-packages/pandas/core/groupby.py in _cython_agg_general(self, how, numeric_only) 
    1415 
    1416  def _cython_agg_general(self, how, numeric_only=True): 
-> 1417   new_blocks = self._cython_agg_blocks(how, numeric_only=numeric_only) 
    1418   return self._wrap_agged_blocks(new_blocks) 
    1419 

/usr/lib/python2.7/site-packages/pandas/core/groupby.py in _cython_agg_blocks(self, how, numeric_only) 
    1455 
    1456   if len(new_blocks) == 0: 
-> 1457    raise DataError('No numeric types to aggregate') 
    1458 
    1459   return new_blocks 

DataError: No numeric types to aggregate 

risposta

20

Come si generano i dati?

Vedere come l'output mostra che i dati sono di tipo "oggetto"? le operazioni di groupby controllano in particolare se ciascuna colonna è prima un dtype numerico.

In [31]: data 
Out[31]: 
<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 2557 entries, 2004-01-01 00:00:00 to 2010-12-31 00:00:00 
Freq: <1 DateOffset> 
Columns: 360 entries, -89.75 to 89.75 
dtypes: object(360) 

sguardo ↑


Hai inizializzare un dataframe vuota e poi riempito esso? Se è così è probabilmente perché è cambiato con la nuova versione come prima 0.9 empty DataFrames sono stati inizializzati in tipo float ma ora sono di tipo oggetto. In tal caso, è possibile modificare l'inizializzazione su DataFrame(dtype=float).

Si può anche chiamare frame.astype(float)

+0

Grazie! Immagino di iniziare davvero * attentamente * a leggere le note di rilascio su ogni versione ...;) –

4

ho ottenuto questo errore genera un frame di dati che consiste di timestamp e dati:

df = pd.DataFrame({'data':value}, index=pd.DatetimeIndex(timestamp)) 

Aggiunta la soluzione suggerita funziona per me:

df = pd.DataFrame({'data':value}, index=pd.DatetimeIndex(timestamp), dtype=float)) 

Grazie Chang She!

Esempio:

     data 
2005-01-01 00:10:00 7.53 
2005-01-01 00:20:00 7.54 
2005-01-01 00:30:00 7.62 
2005-01-01 00:40:00 7.68 
2005-01-01 00:50:00 7.81 
2005-01-01 01:00:00 7.95 
2005-01-01 01:10:00 7.96 
2005-01-01 01:20:00 7.95 
2005-01-01 01:30:00 7.98 
2005-01-01 01:40:00 8.06 
2005-01-01 01:50:00 8.04 
2005-01-01 02:00:00 8.06 
2005-01-01 02:10:00 8.12 
2005-01-01 02:20:00 8.12 
2005-01-01 02:30:00 8.25 
2005-01-01 02:40:00 8.27 
2005-01-01 02:50:00 8.17 
2005-01-01 03:00:00 8.21 
2005-01-01 03:10:00 8.29 
2005-01-01 03:20:00 8.31 
2005-01-01 03:30:00 8.25 
2005-01-01 03:40:00 8.19 
2005-01-01 03:50:00 8.17 
2005-01-01 04:00:00 8.18 
        data 
2005-01-01 00:00:00 7.636000 
2005-01-01 01:00:00 7.990000 
2005-01-01 02:00:00 8.165000 
2005-01-01 03:00:00 8.236667 
2005-01-01 04:00:00 8.180000