我有一个数据框dfuser amount1 18.902 1092.222 293.011 40.00我想将每个用户数量除以该用户数量的范数。因此,结果数据框将是dfuser amount1 0.42722 0.96582 0.25911 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()在每个用户数量上使用该方法。如何将每个用户数量除以用户数量规范?
1 回答
喵喵时光机
TA贡献1846条经验 获得超7个赞
您可以使用该.sum函数,而不要进行分组依据:
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()
添加回答
举报
0/150
提交
取消