Python Zscore使用groupby规范化数据帧中的列
我有一个数据框,用许多列表示客户订单,其中两列是“user_id”和“dollar” 例如: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
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))