簡體   English   中英

嘗試使用 Pandas 數據框中其他兩列的 groupby 基於另一列創建新的滾動平均列時出錯

[英]Error when trying to create new rolling average column based on another column using groupby of two other columns in pandas data frame

我正在嘗試在數據框中的“cum_year_WHIP”列中創建一個名為“MA3_WHIP”的移動平均線(窗口 = 3)的新列。 我嘗試了以下代碼來實現它:

read_and_optimized['MA3_WHIP'] = read_and_optimized['cum_year_WHIP'].rolling(3).mean()

但這出於某種原因並沒有給我我想要的滾動平均值。

在創建 'cum_year_WHIP' 列之前,我按 'YEAR_ID' 和 'Game_date' 對 df 進行了排序:

read_and_optimized.sort_values(['YEAR_ID','Game_Date'], ascending=True,inplace=True)

然后我創建了 'cum_year_WHIP' 列,該列是新的滾動平均列 'MA3_WHIP' 所基於的列,並且是通過在其他三個列((cum_walks_a + cum_hits_a)/cum_innings_pitched)之間的數學上使用 cumsum() 計算得出的:

read_and_optimized['cum_year_WHIP'] =(read_and_optimized['cum_year_walks_a'] + read_and_optimized['cum_year_hits_a'])/ read_and_optimized['cum_year_innings_pitched']

特別是,我希望“MA3_WHIP”按“YEAR_ID”和“Game_Date”列排序,就像“cum_year_WHIP”列一樣,並按“resp_starting_pitcher”和“YEAR_ID”列分組。

要打印出表格的樣子,我使用以下代碼:

df=read_and_optimized[['YEAR_ID','Game_Date','resp_starting_pitcher','cum_year_WHIP','MA3_WHIP']].sort_values(['YEAR_ID','Game_Date'], ascending=True).groupby(['resp_starting_pitcher','YEAR_ID']).apply(print)

從中它給了我這個不需要的輸出:

    YEAR_ID  Game_Date resp_starting_pitcher  cum_year_WHIP  MA3_WHIP
30677     2012 2012-08-25              abadf001       2.000000  1.438035
19247     2012 2012-08-31              abadf001       2.280009  1.547771
35725     2012 2012-09-05              abadf001       2.270277  1.622140
19257     2012 2012-09-12              abadf001       2.234052  1.736054
42448     2012 2012-09-18              abadf001       1.983877  1.646596
19273     2012 2012-09-24              abadf001       1.880600  1.444433
       YEAR_ID  Game_Date resp_starting_pitcher  cum_year_WHIP  MA3_WHIP
6930      2011 2011-05-21              aceva001       1.000000  1.257886
17000     2011 2011-05-26              aceva001       1.090909  1.228938
6936      2011 2011-05-31              aceva001       1.437500  1.554379
6954      2011 2011-06-21              aceva001       1.571429  1.710058

相反,我想得到的是“cum_year_WHIP”的滾動平均值,它從每個新的“resp_starting 投手”開始,並在每個新的“YEAR_ID”開始時開始。 它應該是這樣的:

   YEAR_ID  Game_Date resp_starting_pitcher  cum_year_WHIP  MA3_WHIP
30677     2012 2012-08-25              abadf001       2.000000  Nan
19247     2012 2012-08-31              abadf001       2.280009  Nan
35725     2012 2012-09-05              abadf001       2.270277  2.183428
19257     2012 2012-09-12              abadf001       2.234052  2.261446
42448     2012 2012-09-18              abadf001       1.983877  2.162735
19273     2012 2012-09-24              abadf001       1.880600  2.032843

       YEAR_ID  Game_Date resp_starting_pitcher  cum_year_WHIP  MA3_WHIP
6930      2011 2011-05-21              aceva001       1.000000  Nan
17000     2011 2011-05-26              aceva001       1.090909  Nan
6936      2011 2011-05-31              aceva001       1.437500  1.171613
6954      2011 2011-06-21              aceva001       1.571429  1.366612

       YEAR_ID  Game_Date resp_starting_pitcher  cum_year_WHIP  MA3_WHIP
7210      2013 2013-04-11              aceva001       1.800000  Nan
13938     2013 2013-04-17              aceva001       1.900000  Nan
7226      2013 2013-04-23              aceva001       2.250006  1.983333
7260      2013 2013-05-27              aceva001       2.068969  2.072991
44210     2013 2013-06-12              aceva001       1.894739  2.071238
7276      2013 2013-06-18              aceva001       1.780222  1.914643

當我使用以下內容時,它可以生成表格外觀的視圖: read_and_optimized.groupby(['resp_starting_pitcher','YEAR_ID'])['cum_year_WHIP'].rolling(3).mean()但是,當我嘗試按照其他類似問題的帖子中的建議從上述代碼創建一個新列,它給了我一個錯誤:

read_and_optimized['MA3_WHIP']= read_and_optimized.groupby(['resp_starting_pitcher','YEAR_ID'])['cum_year_WHIP'].rolling(window=3).mean()

錯誤是:

TypeError: incompatible index of inserted column with frame index

有沒有辦法可以在數據框中創建這個新列?

我在以下位置查看了類似困境的答案: 為什么 groupby 和滾動不能一起工作?

和在: 熊貓 - 移動平均 - 使用當前行的前 X 個條目的值

但我無法完成。

幫助完成這項工作將不勝感激。

好的,我終於找到了一個適用於我的情況的帖子來提供幫助。 正如問題的答案中所指出的: https : //stackoverflow.com/questions/52801540/pandas-groupby-then-rolling-mean我不得不

必要的是重置 groupby 列的索引,在本例中為列“resp_starting_pitcher”和“YEAR_ID”,然后將它們放入代碼中以創建新的滾動平均列:

read_and_optimized['MA3_WHIP']=read_and_optimized.groupby(['resp_starting_pitcher','YEAR_ID'])['cum_year_WHIP'].rolling(3).mean().reset_index(level = ('resp_starting_pitcher','YEAR_ID'), drop = True)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM