Pandas:滚动平均仅使用基于另一列的最后更新
Pandas: Rolling mean using only the last update based on another column
我想执行滚动平均值,同时平均值排除在另一列中找到的重复项。让我提供一个示例数据框:
Date Warehose Value
10-01-1998 London 10
13-01-1998 London 13
15-01-1998 New York 37
12-02-1998 London 21
20-02-1998 New York 39
21-02-1998 New York 17
在这个例子中,假设我想执行 Value
的 30 天滚动平均值,但只考虑仓库位置的最后更新。生成的数据帧预计为:
Date Value Rolling_Mean
02-01-1998 10 10
05-01-1998 13 13
15-01-1998 37 20
12-02-1998 21 29
20-02-1998 39 30
21-02-1998 17 19
我的数据量比较大,希望尽可能高效。
有点棘手。由于 rolling.apply
仅适用于 Series 并且您需要“Wharehose”和“Value”来执行计算,因此您需要使用函数(和“全局”变量,这不是超级干净的 IMO)访问完整的数据帧):
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
df2 = df.set_index('Date')
def agg(s):
return (df2.loc[s.index]
.drop_duplicates(subset='Warehose', keep='last')
['Value'].mean()
)
df['Rolling_Mean'] = (df.sort_values(by='Date')
.rolling('30d', on='Date')
['Value']
.apply(agg, raw=False)
)
输出:
Date Warehose Value Rolling_Mean
0 1998-01-10 London 10 10.0
1 1998-01-13 London 13 13.0
2 1998-01-15 New York 37 25.0
3 1998-02-12 London 21 29.0
4 1998-02-20 New York 39 30.0
5 1998-02-21 New York 17 19.0
我想执行滚动平均值,同时平均值排除在另一列中找到的重复项。让我提供一个示例数据框:
Date Warehose Value
10-01-1998 London 10
13-01-1998 London 13
15-01-1998 New York 37
12-02-1998 London 21
20-02-1998 New York 39
21-02-1998 New York 17
在这个例子中,假设我想执行 Value
的 30 天滚动平均值,但只考虑仓库位置的最后更新。生成的数据帧预计为:
Date Value Rolling_Mean
02-01-1998 10 10
05-01-1998 13 13
15-01-1998 37 20
12-02-1998 21 29
20-02-1998 39 30
21-02-1998 17 19
我的数据量比较大,希望尽可能高效。
有点棘手。由于 rolling.apply
仅适用于 Series 并且您需要“Wharehose”和“Value”来执行计算,因此您需要使用函数(和“全局”变量,这不是超级干净的 IMO)访问完整的数据帧):
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
df2 = df.set_index('Date')
def agg(s):
return (df2.loc[s.index]
.drop_duplicates(subset='Warehose', keep='last')
['Value'].mean()
)
df['Rolling_Mean'] = (df.sort_values(by='Date')
.rolling('30d', on='Date')
['Value']
.apply(agg, raw=False)
)
输出:
Date Warehose Value Rolling_Mean
0 1998-01-10 London 10 10.0
1 1998-01-13 London 13 13.0
2 1998-01-15 New York 37 25.0
3 1998-02-12 London 21 29.0
4 1998-02-20 New York 39 30.0
5 1998-02-21 New York 17 19.0