python-3.x - Pandas 将值与前几行的平均值进行比较
问题描述
鉴于以下数据,
import pandas as pd
data = [['AAA','2019-01-01', 10], ['AAA','2019-01-02', 21],
['AAA','2019-02-01', 30], ['AAA','2019-02-02', 45],
['BBB','2019-01-01', 50], ['BBB','2019-01-02', 60],
['BBB','2019-02-01', 70],['BBB','2019-02-02', 59]]
dfx = pd.DataFrame(data, columns = ['NAME', 'TIMESTAMP','VALUE'])
NAME TIMESTAMP VALUE
0 AAA 2019-01-01 10
1 AAA 2019-01-02 21
2 AAA 2019-02-01 30
3 AAA 2019-02-02 45
4 BBB 2019-01-01 50
5 BBB 2019-01-02 60
6 BBB 2019-02-01 70
7 BBB 2019-02-02 59
是否可以将每个组的最后一个值('NAME')与前 3 行的平均值进行比较,所以预期的输出有点像下面,
NAME TIMESTAMP VALUE RESULT
0 AAA 2019-01-01 10
1 AAA 2019-01-02 21
2 AAA 2019-02-01 30
3 AAA 2019-02-02 45 False
4 BBB 2019-01-01 50
5 BBB 2019-01-02 60
6 BBB 2019-02-01 70
7 BBB 2019-02-02 59 True
因此,“AAA”组的结果为 False,因为值 45“大于”前 3 个值 (10+21+30) 的平均值,而“BBB”组的结果为 True,因为值 59 为“小于前 3 个值的平均值 (50+60+70)。
问候。
解决方案
这应该有效:
def compare(a, b):
if a > b:
return False
elif a < b:
return True
dfx['rolling_mean'] = dfx.VALUE.rolling(3, 3).mean()
s = dfx.duplicated('NAME', keep = 'last')
dfx['RESULT'] = dfx[~s].apply(lambda x: compare(x.VALUE, x.rolling_mean), axis = 1)
推荐阅读
- angular5 - “预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 Access-Control-Allow-Origin”
- c - 尝试处理 Fortran 指针 - 调用 c_f_pointer
- c++ - 如何在 C++ 中检查未定义的变量
- javascript - Bootstrap 4 下载的文件不起作用。我错过了什么吗?
- mysql - 在 Kubernetes 中向 MySQL 添加另一个用户
- hibernate - 如何将参数从方法传递到休眠查询
- ios - React Native Camera:访问捕捉的图像
- c# - 按 NextObjectId 排序对象列表
- git - Jenkins 上的 bitbucket 身份验证失败
- javascript - script.js:7 Uncaught SyntaxError: Unexpected token {