У меня есть DataFrame со столбцом timedeltas (на самом деле при осмотре dtype timedelta64[ns]
или <m8[ns]
), и я хотел бы использовать split-comb-apply, но timedelta колонка при падении:split-apply-comb on pandas timedelta column
import pandas as pd
import numpy as np
pd.__version__
Out[3]: '0.13.0rc1'
np.__version__
Out[4]: '1.8.0'
data = pd.DataFrame(np.random.rand(10, 3), columns=['f1', 'f2', 'td'])
data['td'] *= 10000000
data['td'] = pd.Series(data['td'], dtype='<m8[ns]')
data
Out[8]:
f1 f2 td
0 0.990140 0.948313 00:00:00.003066
1 0.277125 0.993549 00:00:00.001443
2 0.016427 0.581129 00:00:00.009257
3 0.048662 0.512215 00:00:00.000702
4 0.846301 0.179160 00:00:00.000396
5 0.568323 0.419887 00:00:00.000266
6 0.328182 0.919897 00:00:00.006138
7 0.292882 0.213219 00:00:00.008876
8 0.623332 0.003409 00:00:00.000322
9 0.650436 0.844180 00:00:00.006873
[10 rows x 3 columns]
data.groupby(data.index < 5).mean()
Out[9]:
f1 f2
False 0.492631 0.480118
True 0.435731 0.642873
[2 rows x 2 columns]
Или, заставляя панда попробовать операцию на 'td'
колонки:
data.groupby(data.index < 5)['td'].mean()
---------------------------------------------------------------------------
DataError Traceback (most recent call last)
<ipython-input-12-88cc94e534b7> in <module>()
----> 1 data.groupby(data.index < 5)['td'].mean()
/path/to/lib/python3.3/site-packages/pandas-0.13.0rc1-py3.3-linux-x86_64.egg/pandas/core/groupby.py in mean(self)
417 """
418 try:
--> 419 return self._cython_agg_general('mean')
420 except GroupByError:
421 raise
/path/to/lib/python3.3/site-packages/pandas-0.13.0rc1-py3.3-linux-x86_64.egg/pandas/core/groupby.py in _cython_agg_general(self, how, numeric_only)
669
670 if len(output) == 0:
--> 671 raise DataError('No numeric types to aggregate')
672
673 return self._wrap_aggregated_output(output, names)
DataError: No numeric types to aggregate
Однако, принимая среднее значение столбца работает отлично, поэтому числовые операции должны быть возможны:
data['td'].mean()
Out[11]:
0 00:00:00.003734
dtype: timedelta64[ns]
Очевидно, достаточно легко заставить плавать, прежде чем делать groupby, но я решил, что могу попытаться понять, с чем я столкнулся.
Edit: Смотрите https://github.com/pydata/pandas/issues/5724
Это отлично сформулированный вопрос! Вы можете использовать это с помощью частной функции: 'data.groupby (data.index <5) ._ cython_agg_general ('mean', numeric_only = False)', но вам нужно сделать это еще раз ... Я думаю, что это должно вероятно, будет [запрос функции на github] (https://github.com/pydata/pandas/issues/new). –
Спасибо! Не знаете, какую особенность запросить конкретно ... что панды должны хотя бы * попробовать * запустить 'cython_agg_general' с' numeric_only = False', потому что иногда это работает? – ontologist
Эта группа и т. Д. Должна распознавать и возвращать даты ... Я подозреваю, что будет более элегантная реализация, чем использовать agg_general, подобный этому ... –