我正在使用這裏顯示的示例中的數據: 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)
該代碼給出了預期的效果,如上圖所示。
我已經嘗試了使用變換的不同變體,但一直沒有能夠像在棄用之前那樣在一行中編寫代碼。是否有單行的語法可以工作?謝謝。
'df ['B'的和] = df.groupby('A')。cumsum()' – AChampion
@AChampion:如果這意味着要回答問題,請將其添加爲答案。 – DSM
謝謝,這個作品。我不確定是否需要爲這個問題提出一個新問題,但在上面的例子中,'滾動'代替'擴展'和'平均'代替'總和'。 cumsum有沒有相當於「rollmean」的?如果不是,我的問題仍然適用於'滾動'和'平均'。如果我不得不問一個新問題,我會的。 – BPowers97