2017-05-30 121 views
2

我正在使用這裏顯示的示例中的數據: http://pandas.pydata.org/pandas-docs/stable/groupby.html。轉到子標題:窗口和重新取樣操作的新語法大熊貓groupby擴展語法優化

在命令提示符處,新語法的工作方式如熊貓文檔中所示。但是我希望將擴展數據的新列添加到現有數據框中,就像在保存的程序中那樣。

語法升級到GROUPBY擴展代碼之前,我可以使用下面的一行代碼:

df = pd.DataFrame({'A': [1] * 10 + [5] * 10, 'B': np.arange(20)}) 
df['Sum of B'] = df.groupby('A')['B'].transform(lambda x: pd.expanding_sum(x)) 

這給了預期的效果,而且還給出了一個「expanding_sum已過時」的消息。預期結果如下:

A B Sum of B 
0 1 0   0 
1 1 1   1 
2 1 2   3 
3 1 3   6 
4 1 4  10 
5 1 5  15 
6 1 6  21 
7 1 7  28 
8 1 8  36 
9 1 9  45 
10 5 10  10 
11 5 11  21 
12 5 12  33 
13 5 13  46 
14 5 14  60 
15 5 15  75 
16 5 16  91 
17 5 17  108 
18 5 18  126 
19 5 19  145 

我想使用新的語法來替換棄用的語法。如果我嘗試新的語法,我得到錯誤信息:

df['Sum of B'] = df.groupby('A').expanding().B.sum() 

TypeError: incompatible index of inserted column with frame index 

我做了一些搜索放在這裏,和看到的東西,可能有幫助,但它給了我不同的信息:

df['Sum of B'] = df.groupby('A').expanding().B.sum().reset_index(level = 0) 

ValueError: Wrong number of items passed 2, placement implies 1 

我可以得到它的工作的唯一辦法是將結果分配給一個臨時DF,然後將臨時DF合併到原始DF:

temp_df = df.groupby('A').expanding().B.sum().reset_index(level = 0).rename(columns = {'B' : 'Sum of B'}) 
new_df = pd.merge(df, temp_df, on = 'A', left_index = True, right_index = True) 
print (new_df) 

該代碼給出了預期的效果,如上圖所示。

我已經嘗試了使用變換的不同變體,但一直沒有能夠像在棄用之前那樣在一行中編寫代碼。是否有單行的語法可以工作?謝謝。

+0

'df ['B'的和] = df.groupby('A')。cumsum()' – AChampion

+0

@AChampion:如果這意味着要回答問題,請將其添加爲答案。 – DSM

+0

謝謝,這個作品。我不確定是否需要爲這個問題提出一個新問題,但在上面的例子中,'滾動'代替'擴展'和'平均'代替'總和'。 cumsum有沒有相當於「rollmean」的?如果不是,我的問題仍然適用於'滾動'和'平均'。如果我不得不問一個新問題,我會的。 – BPowers97

回答

0

看來你需要一個cumsum:

df.groupby('A')['B'].cumsum() 
+0

謝謝@AChampion。已經更新了答案並在列中保留了'B'列以防DF中有更多的列。 – Allen

0

TL; DR

df['Sum of B'] = df.groupby('A')['B'].transform(lambda x: x.expanding().sum()) 

說明

我們從問題的行開始:

df.groupby('A')['B'].transform(lambda x: pd.expanding_sum(x)) 

讓我們仔細閱讀警告你提到:

FutureWarning:pd.expanding_sum已被棄用爲系列和將是 在將來的版本中刪除,替換 Series.expanding(min_periods = 1)的.sum()

讀取後Pandas 0.17.0: pandas.expanding_sum很明顯,Series警告提到的是pd.expanding_sum的第一個參數。即在我們的案例中是x

現在我們應用警告中建議的代碼轉換。所以pd.expanding_sum(x)變成x.expanding(min_periods=1).sum()

根據Pandas 0.22.0: pandas.Series.expandingmin_periods有一個默認值1所以在你的情況下,它可以完全省略,因此最終的結果。