[FIXED] Pandas vermeiden Summierung von Duplikaten

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.meltwith DataFrame.drop_duplicateszum 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.stackund DataFrame.reset_index, verwenden Sie dann DataFrame.drop_duplicates– with level_0für eindeutige Werte pro Spalte oder level_1fü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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like