计算上周每个ID的平均访问次数,而不会循环

时间:2017-12-01 18:02:27

标签: python pandas

我有一个包含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

我需要计算最后一列。此外,还有许多不同的身份。

2 个答案:

答案 0 :(得分:1)

创建两个提取周和年的新列 -

df['week'] = df.date.dt.week
df['year'] = df.date.dt.year

在周和年执行groupby并提取均值 -

df_weekavg = df.groupby(['week', 'year']).mean().reset_index()

如果您想要原始数据帧的每周平均数据,则需要在weekyear上进行合并(因为df_weekavg将与{df具有相同或更少的行1}})。

答案 1 :(得分:1)

IIUC 我们使用resamplerolling

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)
相关问题