我有以下 DataFrame 和一個任意函數df = pd.DataFrame( {'grp': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3], 'val': [0.80485036, 0.30698609, 0.33518013, 0.12214516, 0.66355629, 0.71277808, 0.07193942, 0.97128731, 0.46351423, 0.81494857, 0.82267912, 0.33043168, 0.55643, 0.63413976, 0.37998928, 0.54695376, 0.99751999, 0.02726808, 0.2392102 , 0.93278521, 0.41905688]})def myfunc(arr): return np.product(1+arr) - 1我計算myfunc組內滾動:df.groupby('grp')['val'].rolling(3).apply(myfunc)grp 1 0 NaN 1 NaN 2 2.149576 3 0.958213 4 1.492450 5 2.197331 6 2.054280 7 2.619272 8 2.092553 9 4.236139 10 3.8414062 11 NaN3 12 NaN 13 NaN 14 2.509898 15 2.488528 16 3.264265 17 2.174331 18 1.542845 19 1.460438 20 2.398822這一切都很好。現在我需要將組內的滾動計算向后移動五個周期。df.groupby('grp')['val'].rolling(3).apply(myfunc).shift(-5)grp 1 0 2.197331 1 2.054280 2 2.619272 3 2.092553 4 4.236139 5 3.841406 6 NaN 7 NaN 8 NaN 9 2.509898 10 2.4885282 11 3.2642653 12 2.174331 13 1.542845 14 1.460438 15 2.398822 16 NaN 17 NaN 18 NaN 19 NaN 20 NaNName: val, dtype: float64這里發生了什么?!groupby 的全部目的是保持組之間的界限。大熊貓如何(以及為什么)不尊重這一點。它應該是:grp 1 0 2.197331 1 2.054280 2 2.619272 3 2.092553 4 4.236139 5 3.841406 6 NaN 7 NaN 8 NaN 9 NaN 10 NaN2 11 NaN3 12 2.174331 13 1.542845 14 1.460438 15 2.398822 16 NaN 17 NaN 18 NaN 19 NaN 20 NaNName: val, dtype: float64這似乎是熊貓中的一個嚴重錯誤。我錯過了什么嗎?我怎樣才能讓groupby做一個groupby?
1 回答

翻閱古今
TA貢獻1780條經驗 獲得超5個贊
問題是,當分成幾塊時,代碼
df.groupby('grp')['val'].rolling(3).apply(myfunc).shift(-5)
相當于
tmp = df.groupby('grp')['val'].rolling(3).apply(myfunc)
out = tmp.shift(-5)
在這里,tmp是一個正常的pd.Series. 正如您現在可以猜測的那樣,out在正常系列上移動,沒有任何分組。這是預期的行為。
要獲得所需的輸出,您可以與另一個 groupby 鏈接:
(df.groupby('grp')['val'].rolling(3).apply(myfunc)
.groupby('grp').shift(-5) # extra groupby here
)
一切都應該很好。
添加回答
舉報
0/150
提交
取消