2017-08-28 100 views
1

每星期行動平均數假設我有每小時事件次數的計數如下:的使用熊貓

np.random.seed(42) 
idx = pd.date_range('2017-01-01', '2017-01-14', freq='1H') 
df = pd.DataFrame(np.random.choice([1,2,3,4,5,6], size=idx.shape[0]), index=idx, columns=['count']) 
df.head() 

Out[3]: 
        count 
2017-01-01 00:00:00  4 
2017-01-01 01:00:00  5 
2017-01-01 02:00:00  3 
2017-01-01 03:00:00  5 
2017-01-01 04:00:00  5 

如果我想知道數的每天活動本週,我能做之一:

df.pivot_table(values='count', index=df.index.dayofweek, aggfunc='sum') 

df.groupby(df.index.dayofweek).sum() 

個這兩個收益率:

Out[4]: 
    count 
0 161 
1 170 
2 164 
3 133 
4 169 
5  98 
6 172 

但是,如果我想計算平均每工作日事件,以下

df.pivot_table(values='count', index=df.index.dayofweek, aggfunc='mean') # [#1] 

錯誤此方法使用總和(如上面計算的),並將其除以一週中每天出現的小時數。

我找到的解決方法是:

df_by_day = df.resample('1d').sum() 
df_by_day.pivot_table(values='count', index=df_by_day.index.dayofweek, aggfunc='mean') 

也就是說,第一重採樣到幾天,然後轉動它。不知怎的,[#1]的方法對我來說很自然。是否有更多的pythonic方式來實現我想要的?爲什麼沒有重新採樣均值是錯誤地計算的?

+0

你仍然需要''resample' df_by_day.groupby(df_by_day.index.dayofweek) '計數']的意思是()' – Wen

+0

@Wen增加你的答案爲社區維基(這意味着我沒有得到它的任何代表)。如果您決定發佈答案,我會將其刪除。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ夥計,這是好的〜我在這裏幫忙,並得到了幫助,而不是爲了〜:-) – Wen

回答

2

Resample first using df.resample and then df.groupby

df = df.resample('1d').sum() 
print(df) 

      count 
2017-01-01  92 
2017-01-02  86 
2017-01-03  86 
2017-01-04  90 
2017-01-05  64 
2017-01-06  82 
2017-01-07  97 
2017-01-08  80 
2017-01-09  75 
2017-01-10  84 
2017-01-11  74 
2017-01-12  69 
2017-01-13  87 
2017-01-14  1 

out = df.groupby(df.index.dayofweek)['count'].mean() 
print(out) 

1 85.0 
2 82.0 
3 66.5 
4 84.5 
5 49.0 
6 86.0 
Name: count, dtype: float64