【问题标题】:Pandas : compute mean or std (standard deviation) over entire dataframePandas:计算整个数据帧的平均值或标准差(标准差)
【发布时间】:2014-09-28 05:51:38
【问题描述】:

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

    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() 函数。对于均值来说这不是问题,但对于 std,因为 pandas 函数默认使用 ddof=1,与 numpy 函数不同的是 ddof=0。

【问题讨论】:

  • 按照设计mean 在特定轴上运行,按列或按行。正如您所发现的那样,没有一种方法可以对整个数据帧进行操作,另一种方法是 df.values.mean() 这使用 numpy mean,我认为这与 pandas 使用的相同。
  • @EdChum,是的,但为什么没有像 numpy 中的 axis=None 选项?让axis=0默认? df.values 与 df.get_values() 相同,但感谢您的注意,我获得了空间。
  • 无法回答为什么,我不是 pandas 的开发者,希望其中有人能看到并发表评论
  • 顺便说一句,df.mean().mean() 如果存在缺失值,则不一定会给您正确的答案(因为它会计算列均值的平均值,并且相对于没有缺失值的列,会隐式加权具有缺失值的列)

标签: python numpy pandas


【解决方案1】:

您可以使用stack 将数据框转换为单列(这会将形状从 5x3 更改为 15x1),然后取标准差:

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默认会给出整个数组的标准差,所以在取标准差之前不需要reshape。

补充几点:

  • 这里的 numpy 方法比 pandas 方法快一点,当您可以选择使用 numpy 或 pandas 完成相同的事情时,这通常是正确的。速度差异取决于数据的大小,但当我在笔记本电脑上测试几个不同大小的数据帧(numpy 版本 1.15.4 和 pandas 版本 0.23.4)时,numpy 大约快 10 倍。

  • 这里的 numpy 和 pandas 方法不会给出完全相同的答案,但会非常接近(在几位数的精度下相同)。差异是由于幕后实现的细微差异影响浮点值的四舍五入方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多