1

次の形式の pandas DataFrame があります。

import pandas as pd

df = pd.DataFrame({
    'a': [1,2,3,4,5,6],
    'b': [0,1,0,1,0,1]
})

「b」の値でデータをグループ化し、各グループの「a」のローリング合計を含む新しい列「c」を追加してから、すべてのグループをグループ化されていない DataFrame に再結合して、「 c'列。私は限りました:

for i, group in df.groupby('b'):
    group['c'] = group.a.rolling(
        window=2,
        min_periods=1,
        center=False
    ).sum()

しかし、このアプローチにはいくつかの問題があります。

  • forループを使用して各グループを操作すると、大きなDataFrame(私の実際のデータなど)では遅くなるように感じます

  • グループごとに列 'c' を保存して元の DataFrame に戻すエレガントな方法が見つかりません。各グループの c を配列に追加したり、同様のインデックス配列で圧縮したりすることはできますが、それは非常にハックに思えます。ここで見逃している組み込みの pandas メソッドはありますか?

4

1 に答える 1

1

使用groupbyが必須の場合は、groupby.apply代わりにすべてを一度に計算することができます。

df['c'] = df.groupby('b')['a'].apply(lambda x: x.rolling(2, min_periods=1).sum())

から、次のように groupby オブジェクトのメソッドをv0.19.1直接呼び出すことができます。rolling()/expanding()

df['c'] = df.groupby('b').rolling(2, min_periods=1)['a'].sum().sortlevel(1).values

どちらもあなたに与えます:-

df

ここに画像の説明を入力

于 2016-11-28T13:51:13.230 に答える