python - 如何获得Python中每一行的下n行的平均值
问题描述
如何为数据框中的每一行计算下 n 行的平均值?我有一个看起来像的数据框:
Object|Value
A|1
B|2
C|3
D|4
E|5
F|6
G|7
H|8
I|9
J|10
K|11
L|12
M|13
我想为每一行平均接下来的 3 行,所以输出就像
Object|Value|Average_3
A|1|3
B|2|4
C|3|5
D|4|6
... 等等
我正在考虑做类似的事情
df['average_3']=df['value'].apply(lambda x: x.shift(1)+x.shift(2)+x.shift(3)
但是,n 行并不总是相同的,所以我想知道如何在 lambda 函数中应用 for 循环,以及如何管理最后的 n 行,因为它们不会有所有未来的行要做平均上?抱歉,奇怪的格式
解决方案
请注意窗口大小是 3,最小观察值是 3。此外,我曾经rolling
将所有值向上移动两个点(因为你的窗口是 3。如果你的窗口是 4,它会是)。最后三个值为空,因为在索引 10 之后没有三个观察值。shift
.shift(-2)
.shift(-3)
import pandas as pd
from io import StringIO
# sample data
s = """Object|Value
A|1
B|2
C|3
D|4
E|5
F|6
G|7
H|8
I|9
J|10
K|11
L|12
M|13"""
df = pd.read_csv(StringIO(s), sep='|')
# use rolling with shift
df['Average_3'] = df.shift(-1).rolling(3, 3).mean().shift(-2)
出去
Object Value Average_3
0 A 1 3.0
1 B 2 4.0
2 C 3 5.0
3 D 4 6.0
4 E 5 7.0
5 F 6 8.0
6 G 7 9.0
7 H 8 10.0
8 I 9 11.0
9 J 10 12.0
10 K 11 NaN
11 L 12 NaN
12 M 13 NaN
更新
根据您的评论,您是否希望创建一个函数?
def rolling_func(df, window, min_window):
df[f'Average_{str(window)}'] = df.shift(-1).rolling(window, min_window).mean().shift(-(window-1))
return df
rolling_func(df, 4, 4)
推荐阅读
- html - 每当用户选择并更改选项时,它都会将所有先前的选项保存在 Reactjs 中
- reactjs - 将值从 true 设置为 false 反应原生钩子
- google-bigquery - 结合 Bigquery Delete 和 Insert 语句
- python - Pyspark 将 json 数组转换为数据帧行
- javascript - 检查字符串中是否存在来自 list(array) 的两个或多个单词...javascript
- azure - Azure 服务总线和服务总线 1.1 有什么区别?
- python - Beautiful Soup 中 span 标签上的 find_all 产生 AttributeError: ResultSet object has no attribute 'get_text'
- c - C 编程 - 从用户输入中获取中位数
- r - 发生 R linting 问题时如何使 azure devops 构建失败
- reactjs - 如何使用 Ansible 在本地构建部署和服务器 React 应用程序?