2017-03-08 27 views
-1

在数据帧归组时,我有在以下的形式的数据帧:获取NaN值使用的GroupBy

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 

我很困惑,如何解决这个问题,因为逻辑用户是有道理的,即你组监听。对于每个监听,执行最小 - 最大规范化,然后将其保存到原始数据帧中。

+0

首先,您的示例不一致('UserId' vs'user_ID','values' vs'Normal_L'等)请编辑它。其次,我将你的函数应用于你的数据并得到了正确的结果('5 1 5 1',而不是'5 3 NaN 5')。你可能想仔细检查你的例子。至于NaN,你必须在'x.max()== xmin()'时得到它们,在这种情况下你的'min_max'是未定义的。你必须自己决定什么是歌曲的排名,如果他们全部具有相同的“听”值。 – DyZ

+0

我修正了不一致之处,谢谢。这些数据仅仅是一个例子,表明发生了什么,所以你说得对,当'listen'的值是统一的时,NaN可能会发生,那就是x.max()== x.min ()。我将不得不作出检查的条件。 – mmera

回答

0

这似乎是一个更简单的方法对我说:

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

  • 以下(更清晰)代码
  • 这很明显不上user_id列,你怀疑操作导致你的问题。
  • DYZ说你应该明确地处理这个情况,其中x.min()== x.max(),如果你不是用空值。
相关问题