Python 使用GroupBy规范化数据帧中的组时获取NaN值

Python 使用GroupBy规范化数据帧中的组时获取NaN值,python,pandas,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.

我有以下形式的数据框:

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

我对如何解决这个问题感到困惑,因为逻辑是合理的,即您按用户对侦听进行分组。对于每次侦听,执行最小-最大规格化,然后将其保存到原始数据帧中

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

df['normal\u L']=df.groupby('user\u ID')['listens']。应用(最小值最大值)

  • 更少(更清晰)的代码
  • 很明显,它不会对user_ID列进行操作,您怀疑这是导致您出现问题的原因
  • 如前所述,如果对null不满意,则应显式处理x.min()==x.max()的情况

首先,您的示例不一致(
UserId
vs
UserId
vs
Normal\L
),请编辑它。其次,我将您的函数应用于您的数据并得到了正确的结果(
5151
,而不是
53NAN5
)。您可能需要再次检查您的示例。至于NAN,您必须在
x.max()==xmin()
时获取它们,在这种情况下,您的
min\u max
未定义。如果所有歌曲都具有相同的
Listens
值,您必须自己决定歌曲的排名。我修复了不一致之处,谢谢。这些数据只是我脑海中的一个例子,用来说明发生了什么,所以你是对的,当“侦听”的值是一致的,即x.max()==x.min()时,NAN可能正在发生。我必须提出一个条件来检查这一点。