Pandas:计算整个数据框的平均值或标准差(标准偏差)

58

这是我的问题,我有一个类似这样的数据框:

    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() 函数。对于平均值来说这不是问题,但对于标准差来说,这是一个问题,因为 pandas 函数默认使用 ddof=1,而 numpy 函数中的默认值为 ddof=0

3个回答

93
你可以使用 stack 将数据框转换为单列(这将把形状从 5x3 改为 15x1),然后进行标准差计算:
df.stack().std()         # pandas default degrees of freedom is one

另外,您可以使用values将pandas dataframe转换为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方法得到的结果不会完全相同,但非常接近(在几位数字精度上相同)。这种差异是由于在幕后实现的轻微差异影响了浮点值的舍入方式。


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

0

非常简单,您可以这样做:

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

它将会计算所有列的平均值和标准差,然后将它们合并。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接