【问题标题】:Python Pandas calucate Z score of groupby meansPython Pandas 计算 groupby 均值的 Z 分数
【发布时间】:2014-07-29 05:39:12
【问题描述】:

我有一个这样的数据框:

df = pd.DataFrame({'Year' : ['2010', '2010', '2010', '2010', '2010', '2011', '2011', '2011', '2011', '2011', '2012', '2012', '2012', '2012', '2012'],
                   'Name' : ['Bob', 'Joe', 'Bill', 'Bob', 'Joe', 'Dave', 'Bob', 'Joe', 'Bill', 'Bill', 'Joe', 'Dave', 'Dave', 'Joe', 'Steve'],
                    'Score' : [95, 76, 77, 85, 82, 92, 67, 80, 77, 79, 82, 92, 64, 71, 83]})

我想获取每个年份中每个姓名的 Z 分数。

如果像这样子集 Year 列,我可以这样做:

(df[df.Year == '2010'].groupby(['Year', 'Name'])['Score'].mean() - df[df.Year == '2010'].groupby(['Year', 'Name'])['Score'].mean().mean()) / ( df[df.Year == '2010'].groupby(['Year', 'Name'])['Score'].mean().std())

有没有更清洁的方法?

【问题讨论】:

    标签: python-2.7 pandas group-by


    【解决方案1】:

    scipy 中有一个 zscore 功能,但请注意 scipy.stats.zscore 中的默认 delta-degree-of-freedom 为 0:

    In [171]:
    import scipy.stats as ss
    S=(df[df.Year == '2010'].groupby(['Year', 'Name'])['Score'].mean())
    pd.Series(ss.zscore(s, ddof=1), S.index)
    Out[171]:
    Year  Name
    2010  Bill   -0.714286
          Bob     1.142857
          Joe    -0.428571
    dtype: float64
    

    【讨论】:

    • 我没有练习,但是对于 z 分数,不应该 ddof 为 0?我认为它是相对于人口统计数据定义的,而不是样本统计数据(参见 t-score)。
    • @DSM,我认为:并非如此。 Z 分数是均值之差除以标准差。如果我们选择默认值,stats.zscore 使用的标准差是ddof==0,这可能不是我们想要的(并且与pandas 默认值不同)。要匹配 OP 的结果,ddof=1 是必需的。
    • @DSM,而且,你看,要获得 t-score,我们需要将它进一步除以 sqrt(N) N 作为样本大小。
    • 现在我更困惑了——我认为 z-score 和 t-score 是等价的,但在 z-score 中我们使用总体均值和总体标准差。以及我们使用样本均值和样本标准差的t-score。 (你有解释额外 sqrt(N) 因子的链接吗?)我可以理解使用 ddof=1,但我认为这不再是 Z 分数了,是吗?
    • @DSM,很抱歉造成进一步的混乱。为了解释这种差异,本质上是正态分布和 t 分布及其应用之间的差异,将涉及到一些很好的例子。我最喜欢的解释是第 7.9 节,第 169-173 页:books.google.com/books/about/Biometry.html?id=N6KCNw5NHNkC
    猜你喜欢
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 2021-10-20
    • 2019-12-30
    • 1970-01-01
    • 2022-11-21
    相关资源
    最近更新 更多