id vi dates f_id
0 5532714 0.549501 2015-07-07 ff_22
1 5532715 0.540969 2015-07-08 ff_22
2 5532716 0.531477 2015-07-09 ff_22
3 5532717 0.521029 2015-07-10 ff_22
4 5532718 0.509694 2015-07-11 ff_22
在上面的数据框中,我想找到每年的平均年度值。这不起作用:
df.groupby(df.dates.year)['vi'].transform(mean)
我收到此错误:*** AttributeError: 'Series' object has no attribute 'year'
如何解决这个问题?
答案 0 :(得分:4)
我们确保日期为datetime dtype,然后将.dt
访问者用作.dt.year
:
df['dates'] = pd.to_datetime(df.dates)
df.groupby(df.dates.dt.year)['vi'].transform('mean')
输出:
0 0.530534
1 0.530534
2 0.530534
3 0.530534
4 0.530534
Name: vi, dtype: float64
答案 1 :(得分:1)
使用pandas
函数而不是已弃用的Grouper
函数,为以下最新版本的TimeGrouper
(例如v1.1.0)更新并完成@piRsquared的示例:
import pandas as pd
import numpy as np
tidx = pd.date_range('2010-01-01', '2013-12-31', name='dates')
np.random.seed([3,1415])
df = pd.DataFrame(dict(vi=np.random.rand(tidx.size)), tidx)
df.groupby(pd.Grouper(freq='1Y')).mean()
答案 2 :(得分:0)
您还可以pd.TimeGrouper
使用频率A
考虑由四年日常数据组成的数据框df
tidx = pd.date_range('2010-01-01', '2013-12-31', name='dates')
np.random.seed([3,1415])
df = pd.DataFrame(dict(vi=np.random.rand(tidx.size)), tidx)
df.groupby(pd.TimeGrouper('A')).mean()
vi
dates
2010-12-31 0.465121
2011-12-31 0.511640
2012-12-31 0.491363
2013-12-31 0.516614