如何动态计算 Pandas 系列的平均值?

How to dynamically calculate mean of Pandas Series?

我有一个包含一些键和值的系列,就像:

> first
x    0.167965
y    0.380518
z    0.443677
dtype: float64

有时,我还会有另一个,结构相同但编号不同,例如:

> second
x    0.242322
y    0.991292
z    0.850728
dtype: float64

我想得到他们的意思。为此,我可以创建一个 DataFrame,将它们添加为行,然后获取平均值:

> df = pd.DataFrame()
> df = both.append(first, ignore_index=True)
> df = both.append(second, ignore_index=True)
> df
          x         y         z
0  0.167965  0.380518  0.443677
1  0.242322  0.991292  0.850728
> first_second_mean = both.mean()
> first_second_mean
x    0.205144
y    0.685905
z    0.647203
dtype: float64

太棒了,一切正常。

我能做的另一件事是直接将它们相加,然后相除:

> added = first + second
> added
x    0.410287
y    1.371810
z    1.294405
dtype: float64
> first_second_mean = added / 2
> first_second_mean
x    0.205144
y    0.685905
z    0.647203
dtype: float64

如果有第三个,我可以放大它:

> third
x    0.252872
y    0.791024
z    0.809272
dtype: float64

如果我对所有三个都执行 DataFrame 方法:

> df = pd.DataFrame()
> df = df.append(first, ignore_index=True)
> df = df.append(second, ignore_index=True)
> df = df.append(third, ignore_index=True)
> df
          x         y         z
0  0.167965  0.380518  0.443677
1  0.242322  0.991292  0.850728
2  0.252872  0.791024  0.809272
> df.mean()
x    0.221053
y    0.720945
z    0.701226
dtype: float64

如果我手动加除:

> added = first + second + third
> added
x    0.663159
y    2.162834
z    2.103677
dtype: float64
> added / 3
x    0.221053
y    0.720945
z    0.701226
dtype: float64

这行得通,但我必须跟踪系列中的每一个,我需要的是一种仅使用先前平均值的方法,如下所示:

> df = pd.DataFrame()
> df = df.append(first_second_mean, ignore_index=True)
> df = df.append(third, ignore_index=True)
> df
          x         y         z
0  0.205144  0.685905  0.647203
1  0.252872  0.791024  0.809272
> df.mean()
x    0.229008
y    0.738464
z    0.728237
dtype: float64

而且,嗯,结果不匹配。如果我尝试手动添加和划分方法:

> added = first_second_mean + third
> added
x    0.458016
y    1.476929
z    1.456474
dtype: float64
> added / 2
x    0.229008
y    0.738464
z    0.728237
dtype: float64

所有三个的正确平均值:

x    0.221053
y    0.720945
z    0.701226
dtype: float64

三个均值不正确:

x    0.229008
y    0.738464
z    0.728237
dtype: float64

很明显,我的数学是错误的。我如何才能仅使用之前的平均值 (first_second_mean) 和新系列 (third) 计算出正确的平均值,就好像我已经计算了所有部分的平均值 (first, secondthird) 直接?

我只想保留均值,并在出现任何新值时更新它,这可能会发生很多次,而不是本例中的三次。

做小sef_def功能

def ave_sum(l):
    prev = l[0]
    for cur in l[1:]:
        prev = (cur + prev)/2
    return prev
ave_sum([f,s,t])
Out[242]: 
x    0.229008
y    0.738464
z    0.728237
dtype: float64

要更新平均值,您必须跟踪到目前为止您的平均值。

假设您有一个系列 avg,这是 N 之前的项目和一个新项目 new 的平均值,那么只需

avg = (N*avg + new)/(N+1)
N += 1