如何动态计算 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
, second
和 third
) 直接?
我只想保留均值,并在出现任何新值时更新它,这可能会发生很多次,而不是本例中的三次。
做小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
我有一个包含一些键和值的系列,就像:
> 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
, second
和 third
) 直接?
我只想保留均值,并在出现任何新值时更新它,这可能会发生很多次,而不是本例中的三次。
做小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