为了账号安全,请及时绑定邮箱和手机立即绑定

使用前一行值计算 z 分数

使用前一行值计算 z 分数

料青山看我应如是 2021-08-11 21:39:16
我有一个如下所示的数据框: ids    value     1      0.1  1      0.2  1      0.14     2      0.22    ....我试图遍历每个 id 并为每个 id 计算一个新列“z-score”。for id, row in df.groupby('ids'):    row.reset_index(inplace=True)    row.loc[0, 'z_score'] = 0    row.loc[1, 'z_score'] = 0    for i in range (2, len(row)):        row.loc[i, 'z_score'] = (row.loc[i, value] - row.loc[0:i-1][value].mean()) / row.loc[0:i-1][value].std()    print(row)    # How to add each "row" back to the original dataframe? 前两个应该有 z score 为 0。然后使用之前的值(最多 i-1)来计算 z score 每次迭代的均值和标准差。我的 df 将如下所示: ids    value    z_score      1      0.1       ..                1      0.2       ..              1      0.14      ..            2      0.22      ..                 ....
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

使用scipy.stats.zscore:


from scipy.stats import zscore


df['zscore'] =  df.groupby('ids')['value'].transform(zscore)

print(df)

   ids  value    zscore

0    1   0.10 -1.135550

1    1   0.20  1.297771

2    1   0.14 -0.162221

3    2   0.22       NaN

或者,坚持熊猫,


df['zscore'] = df.groupby('ids').value.apply(

                    lambda x: (x - x.mean()) / x.std(ddof=0))

print(df)

       ids  value    zscore

    0    1   0.10 -1.135550

    1    1   0.20  1.297771

    2    1   0.14 -0.162221

    3    2   0.22       NaN

如果您想要扩展 zscore,请尝试groupby+ expanding:


g = df.groupby('ids').value.expanding(min_periods=1)

df['zscore'] = (df['value'] - g.mean().values) / g.std(ddof=0).values


print(df)

   ids  value    zscore

0    1   0.10       NaN

1    1   0.20  1.000000

2    1   0.14 -0.162221

3    2   0.22       NaN


查看完整回答
反对 回复 2021-08-11
  • 1 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信