熊猫:群体之间



我试图在组之间找到z得分,例如在以下数据中

df:
GROUP VALUE
 1     5
 2     2
 1     10
 2     20
 1     7

在第1组中有值5、10、7。

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)

,但无法成功地做到这一点。我该如何实现?

使用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

相关内容

  • 没有找到相关文章

最新更新