簡體   English   中英

Pandas:條件滾動 window 由另一個列元素?

[英]Pandas: Conditional Rolling window by another column element?

我有一個帶有日期、ID 和值的 dataframe。

例如:

date        id        value
2016-08-28   A          1
2016-08-28   B          1
2016-08-29   C          2
2016-09-02   B          0
2016-09-03   A          3
2016-09-06   C          1
2017-01-15   B          2
2017-01-18   C          3
2017-01-18   A          2

我想逐個元素應用滾動平均值,然后聲明一個,這樣結果就會像:

date        id        value    rolling_mean
2016-08-28   A          1           NaN
2016-08-28   B          1           NaN
2016-08-29   C          2           NaN
2016-09-02   B          0           0.5
2016-09-03   A          3           2.0
2016-09-06   C          1           1.5
2017-01-15   B          2           1.0
2017-01-18   C          3           2.0
2017-01-18   A          2           2.5

我最接近的是:

grouped = df.groupby(["id", "value"])
df["rolling_mean"] = grouped["value"].shift(1).rolling(window = 2).mean()

但這給了我錯誤的值,因為它保持了其余元素的順序。

有什么想法嗎?

先感謝您,

您可以僅 groupby id並使用transform

df['rolling_mean'] = df.groupby('id')['value'].transform(lambda x: x.rolling(2).mean())

Output:

         date id  value  rolling_mean
0  2016-08-28  A      1           NaN
1  2016-08-28  B      1           NaN
2  2016-08-29  C      2           NaN
3  2016-09-02  B      0           0.5
4  2016-09-03  A      3           2.0
5  2016-09-06  C      1           1.5
6  2017-01-15  B      2           1.0
7  2017-01-18  C      3           2.0
8  2017-01-18  A      2           2.5

使用帶有 id 的groupby修復您的代碼

grouped = df.groupby(["id"])
df['rolling_mean']=grouped["value"].rolling(window = 2).mean().reset_index(level=0,drop=True)
df
Out[67]: 
        date id  value  rolling_mean
0 2016-08-28  A      1           NaN
1 2016-08-28  B      1           NaN
2 2016-08-29  C      2           NaN
3 2016-09-02  B      0           0.5
4 2016-09-03  A      3           2.0
5 2016-09-06  C      1           1.5
6 2017-01-15  B      2           1.0
7 2017-01-18  C      3           2.0
8 2017-01-18  A      2           2.5

像這樣:

df['rolling_mean'] = df.groupby('id')['value'].rolling(2).mean().reset_index(0,drop=True).sort_index()

Output:

         date id  value  rolling_mean
0  2016-08-28  A      1           nan
1  2016-08-28  B      1           nan
2  2016-08-29  C      2           nan
3  2016-09-02  B      0          0.50
4  2016-09-03  A      3          2.00
5  2016-09-06  C      1          1.50
6  2017-01-15  B      2          1.00
7  2017-01-18  C      3          2.00
8  2017-01-18  A      2          2.50

暫無
暫無

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

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