我有一个这样的数据框:
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())
有更清洁的方法吗?
答案 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