我有一个数据框
df
user amount
1 18.90
2 1092.22
2 293.01
1 40.00
我想将每个用户数量除以该用户数量的范数。因此,结果数据框将是
df
user amount
1 0.4272
2 0.9658
2 0.2591
1 0.9042
因为用户1的范数为norm1=sqrt(18.90^2+40^2)=44.24
,所以我们将所有用户1的金额除以norm1
;并且用户2的范数为norm1=sqrt(1092.22^2+293.01^2)=1130.84
,因此我们将用户2的所有金额除以norm2
。
到目前为止,我有
norms = df.groupby(['user'])['amount'].apply(lambda x: np.sqrt(np.sum(x**2))).values
df.groupby(['user'])['amount'].divide(norms)
>>> AttributeError: Cannot access callable attribute 'divide' of 'SeriesGroupBy' objects, try using the 'apply' method
但这给出了上面的错误。 norms
确实计算正确,但是我似乎无法在每个用户数量上使用.divide()
方法。
如何将每个用户数量除以用户数量标准?
答案 0 :(得分:2)
您可以使用.sum
函数,而不要转到groupby:
m = np.sqrt((df.set_index('user')['amount']**2).sum(level=0))
# sqrt(sum_of_amount_squares_based_on_user)
user
1 44.240366
2 1130.840125
Name: amount, dtype: float64
#map and divide
df['new'] = df['amount']/df['user'].map(m)
user amount new
0 1 18.90 0.427212
1 2 1092.22 0.965848
2 2 293.01 0.259108
3 1 40.00 0.904152
如果您想专门使用groupby
解决方案,可以采用以下方式:
df.assign(new=df['amount']**2).groupby('user').apply(
lambda x : x['amount']/np.sqrt(x['new'].sum())
).reset_index()