Indizes in Pandas zählen


8

Ich denke, dies ist eine rudimentäre Frage, aber ich bin sehr neu darin und konnte sie einfach nicht knacken / die Antwort finden.

Letztendlich versuche ich hier, eindeutige Werte für eine bestimmte Spalte zu zählen und dann zu bestimmen, welche dieser eindeutigen Werte mehr als einen eindeutigen Wert in einer übereinstimmenden Spalte haben.

Für diese Daten versuche ich zu bestimmen, "wer" "mehr als eine Quittung" für alle Einkäufe hat, und dann die gleichen Informationen basierend auf jeder Produktkategorie zu ermitteln.

Mein bisheriger Ansatz:

Wir haben einen Datensatz wie diesen:

receipt,name,etc,category
1,george,xxx,fish
1,george,xxx,cat
2,george,xxx,fish
3,bill,xxx,fish
3,bill,xxx,dog
4,jill,xxx,cat
5,bill,xxx,cat
5,bill,xxx,cat
5,bill,xxx,dog
6,george,xxx,fish

Dann kann ich das machen:

df.set_index(['name','receipt'])

Und umso interessanter

                etc category
name   receipt
george 1        xxx     fish
       1        xxx      cat
       2        xxx     fish
bill   3        xxx     fish
       3        xxx      dog
jill   4        xxx      cat
bill   5        xxx      cat
       5        xxx      cat
       5        xxx      dog
george 6        xxx     fish

Zu diesem Zeitpunkt scheint es mir einfach zu sein, mit den Daten zu arbeiten, aber ich habe es nicht herausgefunden.

Eine Sache, die mich interessiert, ist, dass wenn ich die Daten vor der Indizierung nach Namen sortiere, die Daten nach Namen gruppiert angezeigt werden. In beiden Fällen ist der Index derselbe, daher weiß ich nicht, wie ich nach der Indizierung mit der Darstellung der Daten spielen soll.

Es ist einfach, die Daten nach Kategorien zu finden

>>> orders.loc[orders['category'] == 'fish']
                etc category
name   receipt
george 1        xxx     fish
       2        xxx     fish
bill   3        xxx     fish
george 6        xxx     fish

Aber was ich nicht herausfinden kann, ist, wie man Pandas sagt "Finde mir die Liste der Namen, die mehr als eine Quittung haben".

Kleinere Fragen:

  • Was ist der "Pandas-Weg", um die Länge des Namensteils des Index zu ermitteln? Ich nehme an, ich könnte einfach die nameSpalte in einen Satz verwandeln und die Länge davon ermitteln. Aber ich bin neugierig auf Indizes.

Bearbeiten / Aktualisieren

Danke für diese Antworten! Hier ist eine Klarstellung, wonach ich suche:

Ich versuche "Stammkunden" zu finden: Personen mit mehr als einer Quittung.

Mein Satz aller Kunden wäre also:

names: ['george','bill','jill'], ratio: 1.0

Meine Stammkunden:

names: ['george','bill'], ratio 0.66

Alle "Fisch" -Kunden:

names: ['george','bill'], ratio: 0.666

Meine Stammkunden:

names: ['george'], ratio: 0.333

Ich denke, die Beispiele sehen hilfreich aus, aber Sie können gerne etwas hinzufügen.


Können Sie einen gewünschten (erwarteten) resultierenden Datensatz veröffentlichen?
MaxU

Antworten:


5

Ich denke, vielleicht suchen Sie:

receipts_by_name_x_cat = df.groupby(['name','category']).count()

Oder wenn Sie nur die Summe über alle Kategorien hinweg wünschen:

receipts_by_name = df.groupby(['name']).count()

Dann können Sie diejenigen suchen, die mehr als eine haben:

receipts_by_name[receipts_by_name['receipt']>1]

Und Sie können die Länge eines Index ermitteln, indem Sie Folgendes eingeben:

len(df.index.get_level_values(0))

Angenommen, der Name war die erste Indexspalte (andernfalls ersetzen Sie 1, 2 usw.)


Das ist sehr hilfreich. Ich habe meine Frage jedoch falsch formuliert. "Mehr als eine Quittung" sollte "Mehr als eine Transaktion" sein, dh sie haben mehr als eine eindeutige Quittung. "
Mr. Hasquestions

Froh das zu hören. Betreff: Ihre Frage, wie unterscheiden sich die beiden? Was definiert eine eindeutige Quittung? Ist die Spalte "Quittung" die Quittungs-ID? und die Kategorie sind alle Artikel, die sie auf dieser Quittung gekauft haben? Wenn ja, können Sie versuchen receipts_by_name = df.groupby(['name']).unique(), die Antwort in der Spalte "Quittung" zu finden, denke ich. Sie müssen nur eine andere Groupby-Funktion anwenden.
Atkat12

Richtig, eine Art, darüber nachzudenken, ist, dass jede Zeile im Datensatz eine Werbebuchung in einem Kauf darstellt. Die Quittung ist also die "Quittungs-ID" dieser Transaktion. So kaufte Bill beispielsweise während der Transaktion Nr. 5 zwei Katzenartikel und ist für die Transaktion Nr. 2 verantwortlich. Er ist also ein "Wiederholungskäufer", aber kein "Wiederholungskäufer", da seine beiden Katzenkäufe während derselben Transaktion getätigt wurden.
Mr. Hasquestions

3

Es ist nicht ganz klar, was genau Sie erreichen möchten (es wäre hilfreich, Ihre Ziele zu verstehen, wenn Sie gewünschte / erwartete Datensätze veröffentlichen würden) ...

Aber ich werde versuchen zu raten;)

Daten:

In [100]: df
Out[100]:
   receipt    name  etc category
0        1  george  xxx     fish
1        1  george  xxx      cat
2        2  george  xxx     fish
3        3    bill  xxx     fish
4        3    bill  xxx      dog
5        4    jill  xxx      cat
6        5    bill  xxx      cat
7        5    bill  xxx      cat
8        5    bill  xxx      dog
9        6  george  xxx     fish

Festlegen der virtuellen Spalte count, Anzeigen der Anzahl der nach gruppierten Zeilen nameund Filtern (Abfragen) mithilfe der folgenden .query()Methode:

In [101]: (df.assign(count=df.groupby('name').receipt.transform('size'))
     ...:    .query("category in ['dog','cat'] and count > 1"))
     ...:
Out[101]:
   receipt    name  etc category  count
1        1  george  xxx      cat      4
4        3    bill  xxx      dog      5
6        5    bill  xxx      cat      5
7        5    bill  xxx      cat      5
8        5    bill  xxx      dog      5

oder Sie können nach mehreren Spalten gruppieren und resultierende Gruppen filtern:

In [102]: df.groupby(['name','category']).filter(lambda x: len(x) > 2)
Out[102]:
   receipt    name  etc category
0        1  george  xxx     fish
2        2  george  xxx     fish
9        6  george  xxx     fish
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.