Ausgabe
Ich arbeite mit der Pandas Library und lerne mehr über Datenmanipulation und -analyse. Mit diesem Dataframe ITEM
ItemNo1 ItemNo2 ItemNo3 ItemNo4
0 Paper Paper Rock Paper
1 Scissor Scissor Rock NaN
2 Rock Rock Rock Paper
3 Scissor Paper Scissor Paper
4 Rock Paper Scissor Rock
Ich möchte einen Dataframe mit zwei Spalten erstellen. Artikel- und einzigartige Artikelzeilenanzahl. Die Anzahl der eindeutigen Artikelzeilen sollte nur die eindeutigen Zeilenwerte von Artikel enthalten. Das heißt, wenn es drei gleiche Elemente in der Zeile gibt, wird nur die erste Instanz für die Zählung berücksichtigt. Dies würde folgende Ausgabe bedeuten:
Item UniqueItemRowCount
0 Paper 4
1 Rock 4
2 Scissor 3
Es wird 4 für Rock geben, weil es für Index 0 und 1 einen Rock gibt. Für Index 2 und 4 wurde bereits ein Stein gefunden, der Rest wird ignoriert/nicht für die Summe hinzugefügt.
Mein Hauptproblem ist der Versuch, dafür eine Lambda-Funktion zu erstellen, da ich die Summe nicht richtig erhalten kann. Ich habe auch versucht, die Werte NaN (null) zu machen, wenn in der Zeile ein Duplikat gefunden wird, aber das funktioniert auch nicht.
Lösung
Verwenden Sie DataFrame.melt
with DataFrame.drop_duplicates
zum Zählen von Duplikaten pro Zeile und zählen Sie dann die Werte von Series.value_counts
:
Hinweis: Erwartete Ausgabe ist anders, da entfernte Duplikate pro Zeile:
Es wird 4 für Rock geben, weil es für Index 0 und 1 einen Rock gibt. Für Index 2 und 4 wurde bereits ein Stein gefunden, der Rest wird ignoriert/nicht für die Summe hinzugefügt.
df1 = (df.melt()
.drop_duplicates()['value']
.value_counts()
.rename_axis('Item')
.reset_index(name='UniqueItemRowCount'))
print (df1)
Item UniqueItemRowCount
0 Rock 4
1 Scissor 3
2 Paper 3
Entfernen Sie bei Bedarf Duplikate pro Spalte mit DataFrame.stack
und DataFrame.reset_index
, verwenden Sie dann DataFrame.drop_duplicates
– with level_0
für eindeutige Werte pro Spalte oder level_1
für eindeutige Werte pro Zeile:
df2 = (df.stack()
.reset_index()
.drop_duplicates(['level_0',0])[0]
.value_counts()
.rename_axis('Item')
.reset_index(name='UniqueItemColCount'))
print (df2)
Item UniqueItemColCount
0 Rock 4
1 Paper 4
2 Scissor 3
df1 = (df.stack()
.reset_index()
.drop_duplicates(['level_1',0])[0]
.value_counts()
.rename_axis('Item')
.reset_index(name='UniqueItemRowCount'))
print (df1)
Item UniqueItemRowCount
0 Rock 4
1 Scissor 3
2 Paper 3
Beantwortet von – jezrael
Antwort geprüft von – Robin (FixError Admin)