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