【问题标题】:Non-zero mean when calculating a Z-score in Python / Pandas在 Python / Pandas 中计算 Z 分数时的非零均值
【发布时间】:2020-05-23 09:43:55
【问题描述】:

我正在尝试一次计算一系列列的 z 分数,但检查数据显示列的平均值不是 0,正如您在计算 z 分数时所期望的那样。

通过运行下面的代码可以看到,列a和列d在新创建的*_zscore列中没有0表示。

import pandas as pd
df = pd.DataFrame({'a': [500,4000,20], 'b': [10,20,30], 'c': [30,40,50], 'd':[50,400,20] })

cols = list(df.columns)
for col in cols:
    col_zscore = col + '_zscore'
    df[col_zscore] = (df[col] - df[col].mean())/df[col].std(ddof=0)

print(df.describe())

我的实际数据明显不同,但结果相似(即:非零均值)。我也用过

from scipy import stats
stats.zscore(df)

这会导致类似的结果。在 R 中进行相同的转换(即:scaled.df

有人知道这里发生了什么吗?有错误的列包含更高的值,但也应该可以对它们进行 z 变换。

编辑:正如 Rob 指出的那样,结果基本上是 0。

【问题讨论】:

  • 我认为它只是一个舍入错误。非 0 值基本上是 0 到逗号后的第 16 位。也许 R 使用不同的浮点算法

标签: python pandas


【解决方案1】:

您的平均值是 10^-17 的数量级,实际上它等于零。您没有完全为零的原因与浮点数的表示方式(有限精度)有关。

我很惊讶您在 R 中看不到它,但这可能与您使用的示例有关,并且 scale 在 R 中的实现方式略有不同(例如ddof=1)。但是在 R 中,你会看到同样的事情发生:

> mean(scale(c(5000,40000,2000)))
[1] 7.401487e-17

【讨论】:

  • 谢谢罗伯!这是有道理的。
猜你喜欢
  • 2014-07-29
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-07
  • 2018-07-20
  • 2014-09-05
  • 2021-01-07
相关资源
最近更新 更多