sum
и mean
ведут себя по-разному.Рассмотрим следующие примеры:
In [2]: df = pd.DataFrame({'key': ['a', 'b', 'b'], 'val': [1.2, 2.3, 3.4]})
In [3]: df.groupby('key').val.sum()
Out[3]:
key
a 1.2
b 5.7
Name: val, dtype: float64
In [4]: df.groupby('key').val.mean()
Out[4]:
key
a 1.20
b 2.85
Name: val, dtype: float64
In [7]: df.dtypes
Out[7]:
key object
val float64
dtype: object
Теперь, если я изменю столбец val
таким образом, чтобы он был объектом типа d:
In [8]: df['val'] = df.val.astype(object)
In [9]: df.groupby('key').val.mean()
---------------------------------------------------------------------------
DataError Traceback (most recent call last)
<ipython-input-9-b46b3a9673d0> in <module>()
----> 1 df.groupby('key').val.mean()
~\Miniconda3\lib\site-packages\pandas\core\groupby\groupby.py in mean(self, *args, **kwargs)
1304 nv.validate_groupby_func('mean', args, kwargs, ['numeric_only'])
1305 try:
-> 1306 return self._cython_agg_general('mean', **kwargs)
1307 except GroupByError:
1308 raise
~\Miniconda3\lib\site-packages\pandas\core\groupby\groupby.py in _cython_agg_general(self, how, alt, numeric_only, min_c
ount)
1054
1055 if len(output) == 0:
-> 1056 raise DataError('No numeric types to aggregate')
1057
1058 return self._wrap_aggregated_output(output, names)
DataError: No numeric types to aggregate
In [10]: df.groupby('key').val.sum()
Out[10]:
key
a 1.2
b 5.7
Name: val, dtype: float64
Обратите внимание, что mean
больше не работает для этогоcolumn
Тип d столбца не имеет ничего общего с типом d отдельных ячеек, например:
In [12]: isinstance(df.val[0], float)
Out[12]: True
Поэтому, пожалуйста, проверьте столбец dtype и преобразуйте его в числовое значение.
Теперь, почему в конструкции mean
и sum
ведут себя по-разному, потому что sum
должно быть разрешено воздействовать на нечисловые данные, такие как str
, если суммирование имеет смысл дляэтот тип данных.
In [14]: df['val'] = ['z', 'y', 'x']
In [15]: df.groupby('key').val.sum()
Out[15]:
key
a z
b yx
Name: val, dtype: object
Очевидно, что mean
не имеет смысла для str
.Поэтому для sum
существует дополнительный try-except
блок , чтобы он работал для некоммерческих данных.