我正在尝试查找组之间的z值得分,因此例如在以下数据中
df:
GROUP VALUE
1 5
2 2
1 10
2 20
1 7
第1组中的值为5、10、7。因此,现在我仅在其组中寻找其zscore
Sample Desired Output:
GROUP VALUE Z_SCORE
1 5 0.5
2 2 0.01
1 10 7
2 20 8.3
1 7 1.3
上面的zscore并不是真正的计算值,只是一种表示形式。
我正在尝试以下
def z_score(x):
z = np.abs(stats.zscore(x))
return z
df['Z_SCORE'] = df.groupby(['GROUP'])['Value'].apply(z_score)
,但无法成功完成。我该如何实现?
答案 0 :(得分:3)
使用GroupBy.transform
代替apply
将每组正确的numpy数组正确转换为新的Series
:
from scipy.stats import zscore
def z_score(x):
z = np.abs(zscore(x))
return z
df['Z_SCORE'] = df.groupby('GROUP')['VALUE'].transform(z_score)
print (df)
GROUP VALUE Z_SCORE
0 1 5 1.135550
1 2 2 1.000000
2 1 10 1.297771
3 2 20 1.000000
4 1 7 0.162221
使用GroupBy.apply
的解决方案是可能的,但是对于返回Series
以及每个组的索引是必需的更改函数:
def z_score(x):
z = np.abs(zscore(x))
return pd.Series(z, index=x.index)
df['Z_SCORE'] = df.groupby('GROUP')['VALUE'].apply(z_score)
print (df)
GROUP VALUE Z_SCORE
0 1 5 1.135550
1 2 2 1.000000
2 1 10 1.297771
3 2 20 1.000000
4 1 7 0.162221