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

时间:2018-06-22 16:19:39

标签: python pandas

我有一个数据框

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()方法。

如何将每个用户数量除以用户数量标准?

1 个答案:

答案 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()