使用前一行值计算 z 分数

我有一个如下所示的数据框:


 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      ..            

     ....


料青山看我应如是
浏览 108回答 1
1回答

白板的微信

使用scipy.stats.zscore:from scipy.stats import zscoredf['zscore'] =  df.groupby('ids')['value'].transform(zscore)print(df)   ids  value    zscore0    1   0.10 -1.1355501    1   0.20  1.2977712    1   0.14 -0.1622213    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).valuesprint(df)   ids  value    zscore0    1   0.10       NaN1    1   0.20  1.0000002    1   0.14 -0.1622213    2   0.22       NaN
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python