1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】集約する数値型がない - groupby()の挙動が変わった?

2022-01-01 01:39:10

質問

グループ化されたコードは以下の通りです。

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

古いバージョンのpandasでは動作するのですが、0.9で実行するとエラーが発生します。

DataError: No numeric types to aggregate

解決方法は?

どのようにデータを作成しているのですか?

データが「オブジェクト」タイプであることを示す出力を見てください。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)

ルック ↑ 上位


最初に空のDataFrameを初期化して、それから中身を入れたのでしょうか?0.9以前の空のDataFrameはfloat型で初期化されていましたが、今はobject型になっているので、もしそうなら、新しいバージョンで変わったのでしょう。もしそうなら、初期化を DataFrame(dtype=float) .

を呼び出すこともできます。 frame.astype(float)