Почему pandas означает, что в datetime работают над сериями, но не над групповыми объектами - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь принять среднее значение дат по группам.

import pandas as pd

df = pd.DataFrame({'Id': ['A', 'A', 'B', 'B'],
                   'Date': [pd.datetime(2000, 12, 31), pd.datetime(2002, 12, 31),
                            pd.datetime(2000, 6, 30), pd.datetime(2002, 6, 30)]})

Это всегда было трудной задачей, поэтому мне было приятно узнать, что это явно было исправлено в pandas 0.25 Объекты Datetime с pandas Среднее значение .

df['Date'].mean()
Out[45]: Timestamp('2001-09-30 00:00:00') # This works

Однако это нельзя сделать с помощью «groupby»

df.groupby('Id')['Date'].mean()

Traceback (most recent call last):

  File "<ipython-input-46-5fae5ffac6c6>", line 1, in <module>
    df.groupby('Id')['Date'].mean()

  File "C:\Users\xxx\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 1205, in mean
"mean", alt=lambda x, axis: Series(x).mean(**kwargs), **kwargs

  File "C:\Users\xxx\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 888, in _cython_agg_general
raise DataError("No numeric types to aggregate")

DataError: No numeric types to aggregate

Что здесь происходит, и есть ли легкий обходной путь?

1 Ответ

2 голосов
/ 06 января 2020

Используйте лямбда-функцию с GroupBy.agg или GroupBy.apply:

print (df.groupby('Id')['Date'].agg(lambda x: x.mean()))
print (df.groupby('Id')['Date'].agg(pd.Series.mean))
print (df.groupby('Id')['Date'].apply(lambda x: x.mean()))
print (df.groupby('Id')['Date'].apply(pd.Series.mean))

Id
A   2001-12-31
B   2001-06-30
Name: Date, dtype: datetime64[ns]

Разница в том, если несколько столбцов:

df = pd.DataFrame({'Id': ['A', 'A', 'B', 'B'],
                   'Date': [pd.datetime(2000, 12, 31), pd.datetime(2002, 12, 31),
                            pd.datetime(2000, 6, 30), pd.datetime(2002, 6, 30)]})
df['Date1'] = df['Date']
print (df.groupby('Id').agg(lambda x: x.mean()))
         Date      Date1
Id                      
A  2001-12-31 2001-12-31
B  2001-06-30 2001-06-30
print (df.groupby('Id').agg(pd.Series.mean))
         Date      Date1
Id                      
A  2001-12-31 2001-12-31
B  2001-06-30 2001-06-30

print (df.groupby('Id').apply(lambda x: x.mean()))
Empty DataFrame
Columns: []
Index: []

print (df.groupby('Id').apply(pd.Series.mean))
Empty DataFrame
Columns: []
Index: []

Почему pandas означает, что в datetime работает над сериями, но не над групповым объектом

Некоторое время go было проблемой с mean для Series, Datetimes проверьте это , так что возможно в некоторых следующих версиях pandas это должно работать хорошо.

...