我有以下形式的数据框:
user_ID song_ID listens
------- ------ -------
U0 S1 14
U0 S2 4
U1 S3 23
U1 S4 10
我希望对用户进行规范化,所以我尝试了:
grouped = df['listens'].groupby(df['user_ID'])
min_max = lambda x: (5-1)*((x - x.min()) / (x.max()-x.min())) + 1
df['normal_L'] = grouped.transform(min_max)
大部分都有效!出了什么问题,它还试图规范化用户ID。我怎么知道这一点,我得到的NaN值是在下一个用户的历史开始的时间间隔内。所以像这样......
user_Id song_ID listens normal_L
------- ------ ------- --------
U0 S1 14 5
U0 S2 4 3
U1 S3 23 NaN
U1 S4 10 5
我很困惑如何解决这个问题,因为逻辑是有意义的,即你按用户对听众进行分组。对于每次监听,执行min-max规范化,然后将其保存到原始数据帧中。
答案 0 :(得分:0)
对我来说,这似乎是一种更直接的方法:
df['normal_L'] = df.groupby('user_ID')['listens'].apply(min_max)