我有一个包含ID,日期和访问次数的pandas数据框。如何计算每个ID过去7天(从给定日期开始)的平均访问次数,而不会在数据帧中循环每个观察结果?该小组是不平衡的,即缺少一些日期,所以我们并不总是超过7。
id date visit avg_past_week
0 1 11/03/2017 10 0.0
1 1 11/12/2017 11 0.0
2 1 11/14/2017 12 11.0
3 1 11/15/2017 8 11.5
我需要计算最后一列。此外,还有许多不同的身份。
答案 0 :(得分:1)
创建两个提取周和年的新列 -
df['week'] = df.date.dt.week
df['year'] = df.date.dt.year
在周和年执行groupby
并提取均值 -
df_weekavg = df.groupby(['week', 'year']).mean().reset_index()
如果您想要原始数据帧的每周平均数据,则需要在week
和year
上进行合并(因为df_weekavg
将与{df
具有相同或更少的行1}})。
答案 1 :(得分:1)
IIUC
我们使用resample
和rolling
df['New']=df.date.map(df.set_index('date').iloc[1:].resample('D').sum().rolling(7,min_periods =1).visit.mean()).shift()
df
Out[1460]:
id date visit avg_past_week New
0 1 2017-11-03 10 0.0 NaN
1 1 2017-11-12 11 0.0 NaN
2 1 2017-11-14 12 11.0 11.0
3 1 2017-11-15 8 11.5 11.5
添加fillna(0)
会回复您的预期结果
更多内容
A=[]
for _,df1 in df.groupby('id'):
A.append( df1.date.map( df1.set_index('date').iloc[1:].resample('D').sum().rolling(7, min_periods=1).visit.mean()).shift())
df['New']=pd.concat(A)