首页 > 解决方案 > 如何获得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 行,因为它们不会有所有未来的行要做平均上?抱歉,奇怪的格式

标签: pythonpandasdataframefor-looplambda

解决方案


请注意窗口大小是 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)

推荐阅读