为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PIPIONE 2021-04-01 06:58:01
我有一个数据框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()


查看完整回答
反对 回复 2021-04-13
  • 1 回答
  • 0 关注
  • 220 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信