2013-12-17 26 views
12

Ich habe ein DataFrame mit einer Spalte von timedeltas (tatsächlich bei Inspektion der dtype ist timedelta64[ns] oder <m8[ns]), und ich würde gerne eine Split-kombinieren-Anwendung, aber die Timedelta Spalte wird fallen gelassen:split-apply-kombinieren auf Pandas Timedelta Spalte

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] 

Oder zwingt Pandas den Betrieb auf der 'td' Spalte, um zu versuchen:

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 

jedoch den Mittelwert der Spalte unter funktioniert gut, so numerische Operationen möglich sein sollte:

Offensichtlich ist es einfach genug, um zu schweben, bevor man die Gruppe macht, aber ich dachte mir, ich könnte genauso gut versuchen, zu verstehen, worauf ich gestoßen bin.

Edit: Siehe https://github.com/pydata/pandas/issues/5724

+3

Dies ist eine hervorragend formulierte Frage! Sie können dies umgehen, indem Sie eine private Funktion verwenden: 'data.groupby (data.index <5) ._ cython_agg_general ('mean', numeric_only = False)', aber Sie müssen es wieder zu einem Datum machen ... Ich denke, das sollte wahrscheinlich eine [feature request on github] (https://github.com/pydata/pandas/issues/new). –

+0

Danke! Nicht sicher, welche Funktion speziell angefordert werden muss ... dass Pandas mindestens * versuchen sollten, 'cython_agg_general' mit' numeric_only = False' auszuführen, weil es manchmal funktioniert? – ontologist

+0

Dieses groupby-Mittel usw. sollte Daten erkennen und zurückgeben ... Ich vermute, dass es eine elegantere Implementierung geben wird, als agg_general so zu verwenden ... –

Antwort

1

Stellt sich heraus, das ein Pandas Problem ist, dieses Verhalten needs to be implemented in groupby.py.

In der Zwischenzeit genießen Sie diese Abhilfe, die (Einheiten von Sekunden) zu schweben wirft:

data['td'] = [10**-9 * float(td) for td in data['td']]