I have a dataframe like this:
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]})
我希望能够为每个Name在每个Year中获得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())
有没有更简洁的方法?
stats.zscore
使用的标准偏差为ddof==0
,这可能不是我们想要的(并且与pandas
默认值不同)。为了匹配OP的结果,需要使用ddof=1
。 - CT Zhu