2016-11-28 145 views
0

我有以下形式的熊貓數據幀:重組GROUPBY rollling總和與原始大熊貓數據幀

import pandas as pd 

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

欲組由「B」的值的數據,並添加新的列「C」,其包含一個爲每個組滾動總和'a',然後我想將所有組重新組合成一個包含'c'列的未分組的DataFrame。只要我有:

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

但有幾個問題,這種方法:

  • 使用for循環感覺像它將會是一個的大數據幀緩慢各組工作(像我的實際數據)

  • 我找不到一個優雅的方式來保存每個組的列'c'並將其添加回原始的DataFrame。我可以將每個組的c追加到一個數組,然後用一個類似的索引數組來壓縮它,但是這看起來很詭異。有沒有我在這裏失蹤的內置熊貓方法?

回答

0

如果使用groupby是必須的話,你可以用groupby.apply去計算,而不是所有在一個去:

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

v0.19.1開始,你可以直接調用GROUPBY rolling()/expanding()方法物體如圖所示:

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

這兩個givin g您: -

df 

enter image description here

+1

你可以直接做到這一點:FYI http://pandas.pydata.org/pandas-docs/stable/whatsnew.html#groupby-syntax-with-window-和重採樣操作(雖然我認識到沒有記錄,除了在whatsnew) – Jeff

+0

,如果有人想要提高文檔:https://github.com/pandas-dev/pandas/issues/14759 – Jeff