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.
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
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