[英]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.