【问题标题】:Pandas GroupBy and Calculate Z-Score [duplicate]Pandas GroupBy 和计算 Z 分数 [重复]
【发布时间】:2021-02-19 06:16:46
【问题描述】:

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

pd.DataFrame([[1, 10, 14], [1, 12, 14], [1, 20, 12], [1, 25, 12], [2, 18, 12], [2, 30, 14], [2, 4, 12], [2, 10, 14]], columns = ['A', 'B', 'C'])

    A   B   C
0   1   10  14
1   1   12  14
2   1   20  12
3   1   25  12
4   2   18  12
5   2   30  14
6   2   4   12
7   2   10  14

我的目标是获得 B 列相对于 A 列和 C 列的组的 z 分数。我知道我可以计算每个组的平均值和标准差

test.groupby(['A', 'C']).mean()    
        B
A   C   
1   12  22.5
    14  11.0
2   12  11.0
    14  20.0

test.groupby(['A', 'C']).std()
        B
A   C   
1   12  3.535534
    14  1.414214
2   12  9.899495
    14  14.142136

现在,对于 B 列中的每个项目,我想根据这些均值和标准差计算它的 z 分数。所以第一个结果是 (10 - 11) / 1.41。我觉得必须有一种方法可以在没有太多复杂性的情况下做到这一点,但我一直坚持如何进行。让我知道是否有人可以为我指明正确的方向,或者我是否需要澄清任何事情!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用transform

    Mean=test.groupby(['A', 'C']).B.transform('mean')    
    Std=test.groupby(['A', 'C']).B.transform('std')
    

    然后

    (test.B - Mean) / Std
    

    一个函数zscore来自scipy

    from scipy.stats import zscore
    test.groupby(['A', 'C']).B.transform(lambda x : zscore(x,ddof=1))
    Out[140]: 
    0   -0.707107
    1    0.707107
    2   -0.707107
    3    0.707107
    4    0.707107
    5    0.707107
    6   -0.707107
    7   -0.707107
    Name: B, dtype: float64
    

    好的,显示我的号码,呵呵

    (test.B - Mean) / Std ==test.groupby(['A', 'C']).B.transform(lambda x : zscore(x,ddof=1))
    Out[148]: 
    0    True
    1    True
    2    True
    3    True
    4    True
    5    True
    6    True
    7    True
    Name: B, dtype: bool
    

    【讨论】:

    • 你能手动显示你的输出是正确的吗? zscore 看起来很奇怪。 series-series.mean()/series.std() 按 A 和 C 分组
    • @GoldenLion 你是什么意思..手动?
    • 显示你的数字并列。重复的数字看起来很可疑
    • @GoldenLion 祝你好运
    • @GoldenLion,BENY上面的方法是正确的。 z-scores 都是相同的 0.707107(无论是正还是负)的原因是因为原始用户发布的样本 df 对于每个 groupby 只包含两个“结果”。换句话说,“A”和“C”的每个 groupby 只产生两行。当取行的平均值然后计算 z 分数时,它将达到相同的 0.707107(一个为正,另一个为负)。要查看 BENY 的代码是否正确,只需在原始 df 中添加另一行,例如 [1, 15, 14],您就会看到 z-scores 发生了变化。
    猜你喜欢
    • 2014-07-29
    • 2020-12-05
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多