Geen numerieke typen om te aggregeren – verandering in groupby()-gedrag?

Ik heb een probleem met een groupy-code waarvan ik vrij zeker weet dat deze ooit is uitgevoerd (op een oudere panda-versie). Op 0.9 krijg ik Geen numerieke typen om te aggregerenfouten. Enig idee?

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

Antwoord 1, autoriteit 100%

Hoe genereert u uw gegevens?

Ziet u hoe de uitvoer laat zien dat uw gegevens van het type ‘object’ zijn? de groupby-bewerkingen controleren specifiek of elke kolom eerst een numeriek dtype is.

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)

kijk ↑

Heeft u eerst een leeg DataFrame geïnitialiseerd en daarna gevuld? Als dat zo is, is dat waarschijnlijk de reden waarom het met de nieuwe versie is veranderd, zoals voorheen. 0,9 lege DataFrames werden geïnitialiseerd om te zweven, maar nu zijn ze van het objecttype. Als dit het geval is, kunt u de initialisatie wijzigen in DataFrame(dtype=float).

Je kunt ook frame.astype(float)

. aanroepen


Antwoord 2, autoriteit 21%

Ik krijg deze fout bij het genereren van een dataframe dat bestaat uit tijdstempels en gegevens:

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

Het toevoegen van de voorgestelde oplossing werkt voor mij:

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

Bedankt Chang She!

Voorbeeld:

                    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

Antwoord 3, Autoriteit 4%

Ik heb dit gedaan door:

data_frame.groupby(COL1).COL2.apply(np.mean).reset_index()

Antwoord 4

Hier heb hetzelfde probleem hier, zo lang gezocht om te realiseren dat mijn waarden niet drijft, maar snaren.

Hier is mijn probleem opgelost:

df["column_name"] = pd.to_numeric(df["column_name"], downcast="float")

Other episodes