【问题标题】:How to dynamically calculate mean of Pandas Series?如何动态计算熊猫系列的平均值?
【发布时间】:2020-10-17 13:12:46
【问题描述】:

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

> 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) 来计算正确的平均值,就好像我已经计算了所有部分的平均值一样 (firstsecond 和 @987654336 @) 直接?

我只想保留平均值,并在新值出现时对其进行更新,这可能会发生很多次,而不仅仅是本例中的 3 次。

【问题讨论】:

  • (first_second_mean * 2 + third) / 3?
  • @ScootCork 谢谢。正好有 3 个项目可以解决问题。对于 n 项,我相信 Elliott Collins 的答案可能是解决此问题的最佳方法。不过,我认为两者在数学上基本相同。

标签: python pandas math mean series


【解决方案1】:

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

假设你有一个系列 avg,这是 N 以前的项目和一个新项目 new 的平均值,那么就这样做

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

【讨论】:

  • 非常感谢!您的回答非常清晰易懂。我希望有一些魔法可以扭曲数学并使不保留计数器成为可能,但这似乎不是数学的工作原理。
【解决方案2】:

做小的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

【讨论】:

  • 感谢您的回答!我的问题有点令人困惑,我会尝试对其进行一些编辑。我得到的最后两个结果是“错误”的意思,前四个是“想要的”结果。我相信我在问题中的措辞误导了您,对此我深表歉意。您的解决方案仍然面临我最后几个示例的问题,因为它错误地计算了所有这些值的平均值。
猜你喜欢
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2019-11-24
  • 2021-02-27
相关资源
最近更新 更多