2012-10-11 21 views
15

Tengo un problema con un código de grupo que estoy seguro de que una vez se ejecutó (en una versión de pandas más antigua). En 0.9, obtengo Sin tipos numéricos para agregar errores. ¿Algunas ideas?Sin tipos numéricos para agregar: ¿cambio en el comportamiento de 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 

Respuesta

20

¿Cómo estás generando sus datos?

Vea cómo la salida muestra que sus datos son de tipo 'objeto'? las operaciones groupby comprueban específicamente si cada columna es un tipo de letra numérica primero.

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) 

mirada ↑


Quizás quiso inicializar una trama de datos vacía primero y luego lo llenó? Si es así, esa es probablemente la razón por la que cambió con la nueva versión como antes. 0.9 DataFrames vacíos se inicializaron en tipo flotante pero ahora son de tipo de objeto. Si es así, puede cambiar la inicialización a DataFrame(dtype=float).

También puede llamar frame.astype(float)

+0

Gracias! Creo que realmente empiezo * cuidadosamente * a leer las notas de la versión en cada lanzamiento ...;) –

4

Tengo este error al generar una trama de datos que consiste en marcas de tiempo y datos:

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

Adición de la solución sugerida funciona para mí:

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

Gracias Chang Ella!

Ejemplo:

     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 
Cuestiones relacionadas