I have a time series object
grouped of the type
<pandas.core.groupby.SeriesGroupBy object at 0x03F1A9F0>.
grouped.sum() gives the desired result but I cannot get rolling_sum to work with the
groupby object. Is there any way to apply rolling functions to
groupby objects? For example:
x = range(0, 6) id = ['a', 'a', 'a', 'b', 'b', 'b'] df = DataFrame(zip(id, x), columns = ['id', 'x']) df.groupby('id').sum() id x a 3 b 12
However, I would like to have something like:
id x 0 a 0 1 a 1 2 a 3 3 b 3 4 b 7 5 b 12
Note: as identified by @kekert, the following pandas pattern has been deprecated. See current solutions in the answers below.
In : df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1) Out: 0 0.0 1 0.5 2 1.5 3 3.0 4 3.5 5 4.5 In : df.groupby('id')['x'].cumsum() Out: 0 0 1 1 2 3 3 3 4 7 5 12
For the Googlers who come upon this old question:
Regarding @kekert's comment on @Garrett's answer to use the new
rather than the now-deprecated
df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1)
curiously, it seems that the new .rolling().mean() approach returns a multi-indexed series, indexed by the group_by column first and then the index. Whereas, the old approach would simply return a series indexed singularly by the original df index, which perhaps makes less sense, but made it very convenient for adding that series as a new column into the original dataframe.
So I think I've figured out a solution that uses the new rolling() method and still works the same:
which should give you the series
0 0.0 1 0.5 2 1.5 3 3.0 4 3.5 5 4.5
which you can add as a column:
df['x'] = df.groupby('id')['x'].rolling(2).mean().reset_index(0,drop=True)