Pandas:计算整个DataFrame的均值或标准差

60 投票
4 回答
151112 浏览
提问于 2025-04-18 16:04

我遇到了一个问题,我有一个这样的数据框:

    Depr_1  Depr_2  Depr_3
S3  0   5   9
S2  4   11  8
S1  6   11  12
S5  0   4   11
S4  4   8   8

我只是想计算整个数据框的平均值,但下面的方法不管用:

df.mean()

然后我想出了这个办法:

df.mean().mean()

但是这个方法在计算标准差时不行。我的最后尝试是:

df.get_values().mean()
df.get_values().std()

不过在后面的情况下,它使用了numpy里的mean()和std()函数。计算平均值用numpy的没问题,但计算标准差就有问题了,因为pandas的函数默认使用ddof=1,而numpy的则是ddof=0

4 个回答

0

你还可以这样做:

import numpy as np
import pandas as pd

# approach 1:
mean, std = df.stack().mean(), df.stack().std():

# approach 2:
mean, std = np.mean(df.mean().values), np.std(df.std().values):

第一种方法是把数据在行之间进行汇总,这样就把数据压扁了,可能会掩盖每一列中真实的变化情况。

而第二种方法则保留了列的结构,这样可以更准确地表示整体的标准差。

一般来说,当你在分析一个有多列的DataFrame的标准差时,使用第二种方法会更合适,因为它提供了一个更有意义和易于理解的分散度测量。

0

这很简单,你可以这样做:

df1 = df[1:].mean()
df2 = df[1:].std()
df3 = pd.merge(df1,df2,left_index = True , right_index =True)

这段代码会计算所有列的平均值和标准差,然后把这两个结果合在一起。

2

使用 axis=None

自从 pandas 2.0.0 版本开始,你可以使用 axis=None 来计算整个数据表的平均值。

df.mean(axis=None)

举个例子:

df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]})
df.mean(axis=None)    # 3.5

在未来的版本中,你可以使用 df.std(axis=None) 来计算整个数据表的标准差,不过在 pandas 2.2.0 版本中,@JohnE 的方法 — df.values.std(ddof=1) 仍然是计算标准差的最佳方式。


如果有 NaN 值(缺失值)导致问题,并且 stack() 对你来说太慢,numpy 有内置的函数可以处理这些情况:在每个标准函数前加上 nan 前缀。

np.nanmean(df.values)   # mean with NaN ignored
np.nanstd(df.values)    # stdev with NaN ignored
np.nanmedian(df.values) # median with NaN ignored

另一种方法是直接过滤掉 NaN 值:

df.values[~np.isnan(df.values)].mean()     # mean
df.values[~np.isnan(df.values)].std()      # stdev
np.median(df.values[~np.isnan(df.values)]) # median
95

你可以把数据表(dataframe)转换成一列,使用 stack 这个方法(这样会把原本5行3列的数据变成15行1列),然后再计算标准差:

df.stack().std()         # pandas default degrees of freedom is one

另外,你也可以用 values 把 pandas 数据表转换成 numpy 数组,然后再计算标准差:

df.values.std(ddof=1)    # numpy default degrees of freedom is zero

和 pandas 不同,numpy 默认会计算整个数组的标准差,所以在计算标准差之前不需要改变数据的形状。

还有几点补充说明:

  • 在这里,使用 numpy 的方法比用 pandas 的方法稍微快一点,这种情况通常是对的,尤其是当你可以用 numpy 或 pandas 来完成同样的事情时。速度差异会根据你数据的大小而不同,但我在我的笔记本上测试了几种不同大小的数据表时,发现 numpy 大约快了10倍(numpy 版本1.15.4,pandas 版本0.23.4)。

  • 使用 numpy 和 pandas 的方法得到的结果不会完全一样,但会非常接近(在小数点后几位是相同的)。这种差异是因为它们在后台实现上的细微差别,影响了浮点数值的舍入方式。

撰写回答