Pandas:计算整个DataFrame的均值或标准差
我遇到了一个问题,我有一个这样的数据框:
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 个回答
你还可以这样做:
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的标准差时,使用第二种方法会更合适,因为它提供了一个更有意义和易于理解的分散度测量。
这很简单,你可以这样做:
df1 = df[1:].mean()
df2 = df[1:].std()
df3 = pd.merge(df1,df2,left_index = True , right_index =True)
这段代码会计算所有列的平均值和标准差,然后把这两个结果合在一起。
使用 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
你可以把数据表(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 的方法得到的结果不会完全一样,但会非常接近(在小数点后几位是相同的)。这种差异是因为它们在后台实现上的细微差别,影响了浮点数值的舍入方式。