2017-03-08 70 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(),如果你不是用空值。
相關問題