猿问

如何规范熊猫中的SeriesGroupBy对象?

我有一个数据框


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()在每个用户数量上使用该方法。


如何将每个用户数量除以用户数量规范?


PIPIONE
浏览 221回答 1
1回答

喵喵时光机

您可以使用该.sum函数,而不要进行分组依据:m = np.sqrt((df.set_index('user')['amount']**2).sum(level=0))# sqrt(sum_of_amount_squares_based_on_user)user1      44.2403662    1130.840125Name: amount, dtype: float64#map and divide df['new'] = df['amount']/df['user'].map(m)  user   amount       new0     1    18.90  0.4272121     2  1092.22  0.9658482     2   293.01  0.2591083     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()
随时随地看视频慕课网APP

相关分类

Python
我要回答