2017-08-28 1 views
1

mit Angenommen ich eine Zählung der Anzahl der Ereignis pro Stunde wie folgt:Durchschnittliche Anzahl der Aktionen pro Tag der Woche Pandas

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 

Wenn ich die Gesamt Anzahl der Ereignisse pro Tag wissen wollen der Woche, kann ich entweder tun:

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

oder

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

Beide Ausbeuten:

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

Allerdings, wenn ich die durchschnittliche Anzahl der Ereignisse pro Tag, die folgende

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

ist falsch berechnen möchten !! Dieser Ansatz verwendet die Summe (wie oben berechnet) und teilt sie durch die Anzahl der Stunden auf, die an jedem Wochentag angezeigt werden.

Die Abhilfe, die ich gefunden ist:

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

Das heißt, zuerst Resampling zu Tage, und dann schwenken. Irgendwie fühlt sich der Ansatz in [#1] mir natürlich an. Gibt es einen pythischeren Weg, um das zu erreichen, was ich will? Warum wird ohne Resampling der Mittelwert falsch berechnet?

+0

Sie müssen noch '' resample' df_by_day.groupby (df_by_day.index.dayofweek) [ 'count'] bedeuten() ' – Wen

+0

@Wen hinzugefügt Ihre Antwort als Community Wiki (was bedeutet, dass ich keine Wiederholung davon bekomme). Wenn Sie sich entschließen, eine Antwort zu posten, lösche ich sie. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Kumpel, es ist ok ~ Ich bin hier helfen und bekommen geholfen, nicht für den Punkt ~ :-) – Wen

Antwort

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 
Verwandte Themen