为什么 pandas 意味着在日期时间处理系列而不是 groupby 对象
Why does pandas mean, on datetime, work on a series but not on a groupby object
我正在尝试按组计算日期的平均值。
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 .
中得到修复
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
这是怎么回事,是否有简单的解决方法?
使用 lambda 函数 GroupBy.agg
or 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: []
Why does pandas mean, on datetime, work on a series but not on a groupby object
前段时间 mean
对于系列、日期时间有问题,请检查 this,因此在 pandas 的某些下一个版本中可能会运行良好。
我正在尝试按组计算日期的平均值。
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
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
这是怎么回事,是否有简单的解决方法?
使用 lambda 函数 GroupBy.agg
or 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: []
Why does pandas mean, on datetime, work on a series but not on a groupby object
前段时间 mean
对于系列、日期时间有问题,请检查 this,因此在 pandas 的某些下一个版本中可能会运行良好。