Python Zscore使用groupby规范化数据帧中的列

Python Zscore使用groupby规范化数据帧中的列,python,pandas,numpy,scipy,Python,Pandas,Numpy,Scipy,我有一个数据框,用许多列表示客户订单,其中两列是“user_id”和“dollar” 例如: user_id dollar 0 1 0.34592 5 1 1 0.02857 7 2 1 0.26672 6 3 1 0.34592 5 4 1 0.02857 9 5 1 0.26672 10 6 1 0.34592 6 [...] 7 40 0.02857 20 8 40 0.26672 19 9 40 0.34

我有一个数据框,用许多列表示客户订单,其中两列是“user_id”和“dollar”

例如:

    user_id   dollar 
0  1  0.34592  5
1  1  0.02857  7
2  1  0.26672  6
3  1  0.34592  5
4  1  0.02857  9
5  1  0.26672  10
6  1  0.34592  6
      [...]
7  40  0.02857  20
8  40  0.26672  19
9  40  0.34592  8
10 40  0.02857  18
11 40  0.26672  26
我想规范化美元相对于每一行中其他值的值。对于上一个示例,我希望得到以下结果:

 user_id   dollar norm_dollar
0  1  0.34592  5  -1.02774024
1  1  0.02857  7  0.07905694
2  1  0.26672  6  -0.47434165
3  1  0.34592  5  -1.02774024
4  1  0.02857  9  1.18585412
5  1  0.26672  10  1.73925271
6  1  0.34592  6  -0.47434165
      [...]
7  40  0.02857  20  0.7787612
8  40  0.26672  19  0.57109154
9  40  0.34592  8   -1.71327463
10 40  0.02857  18  0.36342189
编辑:

我希望每个结果对每个用户分别进行归一化,而不是整列的值,因此,例如,对于user2,[20,19,8,18]应该进行归一化,就像平均值是user2顺序的平均值一样,这里的平均值是16,25,而不是整列数据帧的平均值

我知道如何使用一个用户:

user1 = data.loc[data['user_id']==1]
data.loc[data['user_id']==1]['norm_dollar'] = sp.stats.mstats.zscore(user1['dollar'])
我试着为所有用户这样做:

data.dollar.div(sp.stats.mstats.zscore(data.groupby('user_id').dollar))
但我有个错误,你知道怎么做吗


感谢您

使用不同的方法来实现这一点,比如将
groupby
数据帧加入到原始数据帧中,但是我开始喜欢使用
transform
来实现这一点

语法仍然冗长,但我认为它比join方法更具可读性

df['norm_dollar'] = (df['dollar']
                        - df.groupby('user_id')['dollar'].transform(np.mean)) \
                        / df.groupby('user_id')['dollar'].transform(np.std)
如果需要在
np.std
上指定自由度,可以将其转换为

lambda x: np.std(x, ddof=n)

不同的方法可以做到这一点,比如将
groupby
数据帧连接回原始数据帧,但是我开始喜欢使用
transform
处理类似的东西

语法仍然冗长,但我认为它比join方法更具可读性

df['norm_dollar'] = (df['dollar']
                        - df.groupby('user_id')['dollar'].transform(np.mean)) \
                        / df.groupby('user_id')['dollar'].transform(np.std)
如果需要在
np.std
上指定自由度,可以将其转换为

lambda x: np.std(x, ddof=n)

这应该对你有用:

def apply_zscores(x):
    x['norm_dollar'] = zscore(x['dollar'])
    return x

df = df.groupby('id').apply(lambda x: apply_zscores(x))

这应该对你有用:

def apply_zscores(x):
    x['norm_dollar'] = zscore(x['dollar'])
    return x

df = df.groupby('id').apply(lambda x: apply_zscores(x))