2017-03-08 2 views
-1

Ich habe einen Datenrahmen in Form der folgenden Normalisierung Gruppe: across BenutzerNaN-Werte erhalten, wenn in Datenrahmen mit GroupBy

user_ID song_ID listens 
------- ------ ------- 
    U0  S1  14 
    U0  S2  4 
    U1  S3  23 
    U1  S4  10 

Ich möchte normalisieren, so habe ich versucht:

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) 

Für das meiste funktioniert! Was schief geht ist, dass es auch versucht hat, die Benutzer-ID zu normalisieren. Wie ich das weiß, sind die NaN-Werte, die ich bekomme, in den Intervallen, die der nächste Benutzer beginnt. So etwas wie dieses ...

user_Id song_ID listens normal_L 
------- ------ ------- -------- 
    U0  S1  14  5 
    U0  S2  4  3 
    U1  S3  23  NaN 
    U1  S4  10  5 

Ich bin verwirrt, wie dieses Problem zu beheben, da die Logik Sinn heißt Sie Gruppe die Streams durch den Benutzer macht. Für jeden Empfang führen Sie eine Min-Max-Normalisierung durch und speichern sie dann im ursprünglichen Datenrahmen.

+0

Zuerst ist Ihr Beispiel inkonsistent ('UserId' vs' user_ID', 'Werte' vs' Normal_L', etc.) Bearbeiten Sie es. Zweitens habe ich Ihre Funktion auf Ihre Daten angewendet und ein korrektes Ergebnis erhalten ('5 1 5 1', nicht' 5 3 NaN 5'). Vielleicht möchten Sie Ihr Beispiel überprüfen. Was die NaNs betrifft, müssen Sie sie bekommen, wenn 'x.max() == xmin()', in diesem Fall ist Ihre 'min_max' undefiniert. Sie müssen selbst entscheiden, welchen Rang die Songs haben, wenn alle den gleichen Wert von 'Listen' haben. – DyZ

+0

Ich habe die Inkonsistenzen behoben, danke. Die Daten waren nur ein Beispiel von oben, um zu zeigen, was passiert, also hast du recht, die NaNs passieren wahrscheinlich, wenn die Werte für 'Listen' einheitlich sind, das ist x.max() == x.min(). Ich muss eine Bedingung stellen, um das zu überprüfen. – mmera

Antwort

0

Dies scheint ein einfacher Ansatz für mich:

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

  • Weniger (und klarer) Code
  • Es ist sehr eindeutig nicht auf der Benutzer-ID-Säule funktioniert, die Sie vermuten, verursacht du Probleme.
  • wie DYZ sagte, dass Sie den Fall explizit behandeln sollten, wo x.min() == x.max(), wenn Sie mit NULL nicht OK sind.
Verwandte Themen