簡體   English   中英

在 Pandas 的多列上使用 groupby 滾動最大值

[英]Rolling max value with groupby on multiple columns in pandas

我有一個數據框,我想在其中計算前 3 個月滾動值的最大值。 下面是數據框:

VIN   Year_Month    Amount  
  V1    2012-01      196     
  V2    2012-01      113     
  V3    2012-01      177     
  V1    2012-02      154     
  V2    2012-02      129     
  V4    2012-02      156     
  V2    2012-03      100     
  V3    2012-03      174     
  V4    2012-03      127     
  V1    2012-04      139    
  V3    2012-04      194     
  V4    2012-04      178     

使用以下代碼,我試圖計算過去 3 個月內每個 VIN最大值

df['Max_3M_Value'] = df.groupby(['VIN','Year_Month'])['Amount'].rolling(3).max().fillna(0)

但是上面的代碼給出了錯誤:

TypeError: incompatible index of inserted column with frame index

我正在尋找的結果數據框是:

  VIN  Year_Month   Amount  Max_3M_Value
   V1   2012-01      196     196
   V2   2012-01      113     129
   V3   2012-01      177     194
   V1   2012-02      154     196
   V2   2012-02      129     129
   V4   2012-02      156     178
   V2   2012-03      100     129
   V3   2012-03      174     194
   V4   2012-03      127     178
   V1   2012-04      139     196
   V3   2012-04      194     194
   V4   2012-04      178     178

我必須僅使用rolling來計算最大值。我知道我們可以使用pd.pivot_table()解決這個問題,但這不是必需的。

我在這里錯過了什么。

您可以通過僅使用返回值來避免錯誤,但您必須確保在操作期間行的順序不會改變:

df['Max_3M_Value'] = df.groupby(['VIN','Year_Month'])['Amount'].rolling(3).max().fillna(0).values

在您給定的示例中,您的組太小(每個組 1 個元素),無法應用窗口為 3 的滾動:

>>> df.groupby(['VIN','Year_Month'])['Amount'].count()

VIN  Year_Month
V1   2012-01       1
     2012-02       1
     2012-04       1
V2   2012-01       1
     2012-02       1
     2012-03       1
V3   2012-01       1
     2012-03       1
     2012-04       1
V4   2012-02       1
     2012-03       1
     2012-04       1

我相信,您真正想要的是僅按“VIN”分組:

df['Max_3M_Value'] = df.groupby('VIN')['Amount'].transform(lambda s: s.rolling(3, min_periods=1).max())

輸出:

   VIN Year_Month  Amount  Max_3M_Value
0   V1    2012-01     196           196
1   V2    2012-01     113           113
2   V3    2012-01     177           177
3   V1    2012-02     154           196
4   V2    2012-02     129           129
5   V4    2012-02     156           156
6   V2    2012-03     100           129
7   V3    2012-03     174           177
8   V4    2012-03     127           156
9   V1    2012-04     139           196
10  V3    2012-04     194           194
11  V4    2012-04     178           178

滾動窗口為 2 的輸出:

   VIN Year_Month  Amount  Max_3M_Value
0   V1    2012-01     196           196
1   V2    2012-01     113           113
2   V3    2012-01     177           177
3   V1    2012-02     154           196
4   V2    2012-02     129           129
5   V4    2012-02     156           156
6   V2    2012-03     100           129
7   V3    2012-03     174           177
8   V4    2012-03     127           156
9   V1    2012-04     139           154
10  V3    2012-04     194           194
11  V4    2012-04     178           178

如果你真正想要的是每組一個簡單的最大值,你可以這樣做:

>>> df['Max_3M_Value'] = df.groupby('VIN')['Amount'].transform('max')
>>> df
   VIN Year_Month  Amount  Max_3M_Value
0   V1    2012-01     196           196
1   V2    2012-01     113           129
2   V3    2012-01     177           194
3   V1    2012-02     154           196
4   V2    2012-02     129           129
5   V4    2012-02     156           178
6   V2    2012-03     100           129
7   V3    2012-03     174           194
8   V4    2012-03     127           178
9   V1    2012-04     139           196
10  V3    2012-04     194           194
11  V4    2012-04     178           178

嘗試:

>>> df['Max_3M_Value'] = df.groupby('VIN')['Amount'] \
                           .rolling(3).max().bfill().astype(int) \
                           .reset_index(level=0, drop=True)
>>> df
   VIN Year_Month  Amount  Max_3M_Value
0   V1    2012-01     196           196
1   V2    2012-01     113           129
2   V3    2012-01     177           194
3   V1    2012-02     154           196
4   V2    2012-02     129           129
5   V4    2012-02     156           178
6   V2    2012-03     100           129
7   V3    2012-03     174           194
8   V4    2012-03     127           178
9   V1    2012-04     139           196
10  V3    2012-04     194           194
11  V4    2012-04     178           178

暫無
暫無

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

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