Python Pandas通过手段计算组的Z得分

时间:2014-06-08 15:02:14

标签: python-2.7 pandas group-by

我有一个这样的数据框:

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())

有更清洁的方法吗?

1 个答案:

答案 0 :(得分:1)

zscore中有scipy个功能,但请注意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