2017-03-29 96 views
3

我有一個在分組數據框上計算的滾動總和,但它加起來是錯誤的,它是未來的總和,當我需要過去的總和時。如何反向滾動?

我在這裏做錯了什麼?

我進口的尺寸和日期的數據和排序(我曾嘗試刪除的日期排序的話)

df = pd.read_csv('Input.csv', parse_dates=True) 
df.sort_values(['Dimension','Date']) 
print(df) 

我然後創建一個新的列是由滾動窗口

new_column = df.groupby('Dimension').Value1.apply(lambda x: 
x.rolling(window=3).sum()) 
分組多指數

我然後重置索引是原來一樣

df['Sum_Value1'] = new_column.reset_index(level=0, drop=True) 
print(df) 

I H大家也試圖在計算之前扭轉指數,但也失敗了。

輸入

Dimension,Date,Value1,Value2 
1,4/30/2002,10,20 
1,1/31/2002,10,20 
1,10/31/2001,10,20 
1,7/31/2001,10,20 
1,4/30/2001,10,20 
1,1/31/2001,10,20 
1,10/31/2000,10,20 
2,4/30/2002,10,20 
2,1/31/2002,10,20 
2,10/31/2001,10,20 
2,7/31/2001,10,20 
2,4/30/2001,10,20 
2,1/31/2001,10,20 
2,10/31/2000,10,20 
3,4/30/2002,10,20 
3,1/31/2002,10,20 
3,10/31/2001,10,20 
3,7/31/2001,10,20 
3,1/31/2001,10,20 
3,10/31/2000,10,20 

輸出:

Dimension  Date Value1 Value2 Sum_Value1 
0   1 4/30/2002  10  20   NaN 
1   1 1/31/2002  10  20   NaN 
2   1 10/31/2001  10  20  30.0 
3   1 7/31/2001  10  20  30.0 
4   1 4/30/2001  10  20  30.0 
5   1 1/31/2001  10  20  30.0 
6   1 10/31/2000  10  20  30.0 
7   2 4/30/2002  10  20   NaN 
8   2 1/31/2002  10  20   NaN 
9   2 10/31/2001  10  20  30.0 
10   2 7/31/2001  10  20  30.0 
11   2 4/30/2001  10  20  30.0 
12   2 1/31/2001  10  20  30.0 
13   2 10/31/2000  10  20  30.0 

目標產量:

Dimension  Date Value1 Value2 Sum_Value1 
0   1 4/30/2002  10  20  30.0 
1   1 1/31/2002  10  20  30.0 
2   1 10/31/2001  10  20  30.0 
3   1 7/31/2001  10  20  30.0 
4   1 4/30/2001  10  20  30.0 
5   1 1/31/2001  10  20   NaN 
6   1 10/31/2000  10  20   NaN 
7   2 4/30/2002  10  20  30.0 
8   2 1/31/2002  10  20  30.0 
9   2 10/31/2001  10  20  30.0 
10   2 7/31/2001  10  20  30.0 
11   2 4/30/2001  10  20  30.0 
12   2 1/31/2001  10  20   Nan 
13   2 10/31/2000  10  20   NaN 

回答

3

你需要一個落後的總和,因此,反向和之前的系列滾吧:

lambda x: x[::-1].rolling(window=3).sum() 
1

您可以通過window-1結果轉移到獲得靠左對齊結果:

df["sum_value1"] = (df.groupby('Dimension').Value1 
         .apply(lambda x: x.rolling(window=3).sum().shift(-2))) 

enter image description here

+0

我認爲你在OP的例子中被常數值所誤導,但是需要做一個反向總和 – Boud

+0

@Boud我確實忽略了這個部分。但我認爲這還是巧合地給出了正確的結果:)。實際上,如果數據按日期排序,那麼過去或未來就是您放置總和結果的位置。或者,也許OP只需要按照Date按升序對數據框進行排序。 – Psidom

+1

Sneaky @Boud作弊並閱讀OP的帖子中的「words」/ shakes_head – piRSquared

0

向後滾動是一樣滾滾向前,然後轉移的結果:

x.rolling(window=3).sum().shift(-2)