使用GroupBy

时间:2017-03-08 17:59:23

标签: python pandas

我有以下形式的数据框:

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规范化,然后将其保存到原始数据帧中。

1 个答案:

答案 0 :(得分:0)

对我来说,这似乎是一种更直接的方法:

df['normal_L'] = df.groupby('user_ID')['listens'].apply(min_max)

  • 更少(更清晰)的代码
  • 很明显,它不会对user_ID列进行操作,您怀疑这会导致问题。
  • 就像DYZ所说的那样,你应该明确地处理x.min()== x.max()的情况,如果你对空值不满意的话。