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
name
Spalte 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.
Antworten:
Ich denke, vielleicht suchen Sie:
Oder wenn Sie nur die Summe über alle Kategorien hinweg wünschen:
Dann können Sie diejenigen suchen, die mehr als eine haben:
Und Sie können die Länge eines Index ermitteln, indem Sie Folgendes eingeben:
Angenommen, der Name war die erste Indexspalte (andernfalls ersetzen Sie 1, 2 usw.)
quelle
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.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:
Festlegen der virtuellen Spalte
count
, Anzeigen der Anzahl der nach gruppierten Zeilenname
und Filtern (Abfragen) mithilfe der folgenden.query()
Methode:oder Sie können nach mehreren Spalten gruppieren und resultierende Gruppen filtern:
quelle