如何动态计算熊猫系列的均值?

时间:2020-06-26 21:35:18

标签: python pandas math mean 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

我只想保留均值,并用任何新值更新它们,这可能会发生很多次,而不仅仅是本例中的3次。

2 个答案:

答案 0 :(得分:1)

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

假设您有一个系列 NY CA TX FL 20200625.0 NaN NaN NaN NaN 20200626.0 NaN NaN NaN NaN ,它是avg以前项目的平均值,而又是一个新项目N,那么就做

new

答案 1 :(得分:0)

执行小的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