Панды groupby.mean () дают мне «Нет числовых типов для агрегирования» - но .sum () работает - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю в Pandas в Python 3. По какой-то причине я могу сгруппировать и затем суммировать () мой фрейм данных:

full_data.groupby('polarity')['pos'].sum()

polarity
both      1.842
neg       5.241
neu     496.026
pos     245.105
Name: pos, dtype: float64

Когда я выменяю , значит для сумма , однако, я получаю эту ошибку:

DataError: No numeric types to aggregate

Вы знаете, почему это так?Я уже подтвердил, что каждый элемент в столбце 'pos' является плавающей точкой, и на нем выполняется следующий код без вывода:

for i in full_data.loc[:,'pos']:
if type(i) != float:
    print('not a float')

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 12 сентября 2018

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 блок , чтобы он работал для некоммерческих данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...