73

groupedタイプの時系列オブジェクトがあり<pandas.core.groupby.SeriesGroupBy object at 0x03F1A9F0>ます。grouped.sum()目的の結果が得られますが、rolling_sumをgroupbyオブジェクトで機能させることができません。groupbyローリング関数をオブジェクトに適用する方法はありますか?例えば:

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

しかし、私は次のようなものが欲しいです:

  id  x
0  a  0
1  a  1
2  a  3
3  b  3
4  b  7
5  b  12
4

5 に答える 5

74

累計

質問に直接答えるために、cumsum メソッドは目的の系列を生成します。

In [17]: df
Out[17]:
  id  x
0  a  0
1  a  1
2  a  2
3  b  3
4  b  4
5  b  5

In [18]: df.groupby('id').x.cumsum()
Out[18]:
0     0
1     1
2     3
3     3
4     7
5    12
Name: x, dtype: int64

グループごとの pandas ローリング関数

より一般的には、ローリング関数は次のように各グループに適用できます (@kekert がコメントした新しい .rolling メソッドを使用)。戻り値の型は、以前の (非推奨の) pd.rolling_* メソッドとは異なるマルチインデックス シリーズであることに注意してください。

In [10]: df.groupby('id')['x'].rolling(2, min_periods=1).sum()
Out[10]:
id
a   0   0.00
    1   1.00
    2   3.00
b   3   3.00
    4   7.00
    5   9.00
Name: x, dtype: float64

グループごとのローリング関数を適用し、元のデータフレームの順序で結果を受け取るには、代わりに変換を使用する必要があります。

In [16]: df.groupby('id')['x'].transform(lambda s: s.rolling(2, min_periods=1).sum())
Out[16]:
0    0
1    1
2    3
3    3
4    7
5    9
Name: x, dtype: int64

非推奨のアプローチ

参考までに、廃止された pandas.rolling_mean の動作は次のとおりです。

In [16]: df.groupby('id')['x'].apply(pd.rolling_mean, 2, min_periods=1)
Out[16]: 
0    0.0
1    0.5
2    1.5
3    3.0
4    3.5
5    4.5
于 2012-12-21T23:41:42.507 に答える
3

メカニズムはよくわかりませんが、これは機能します。返される値は単なる ndarray であることに注意してください。この方法で累積関数または「ローリング」関数を適用でき、同じ結果が得られるはずです。

でテストしましたが、cumprodそれらはすべて ndarray を返しました。パンダは、これらの関数がシリーズを返すことを知っているほど賢いので、関数は集計ではなく変換として適用されると思います。cummaxcummin

In [35]: df.groupby('id')['x'].cumsum()
Out[35]:
0     0
1     1
2     3
3     3
4     7
5    12

編集:この構文がシリーズを返すのは不思議でした:

In [54]: df.groupby('id')['x'].transform('cumsum')
Out[54]:
0     0
1     1
2     3
3     3
4     7
5    12
Name: x
于 2012-12-21T23:07:35.800 に答える