Gibt es eine Abfrage-Methode oder ähnliches für pandas-Serie (pandas.Serie.query())?
Den pandas.DataFrame.query()
Methode ist der große Verwendung für (pre/post)-filtern von Daten beim laden oder der Darstellung. Es kommt besonders nützlich für die Verkettung von Methoden.
Ich finde mich oft zu wollen, gilt die gleiche Logik auf eine pandas.Series
, z.B. nach einer Methode, wie df.value_counts
das gibt einen pandas.Series
.
Beispiel
Vermuten lässt, gibt es eine riesige Tabelle mit den Spalten Player, Game, Points
und ich möchte plot eines Histogramms der Spieler mit mehr als 14 mal 3 Punkte. Ich muss mir erstmal um die Summe der Punkte der einzelnen Spieler (groupby -> agg
) wird wieder eine Reihe von ~1000 Spieler und Ihre Allgemeine Punkte. Die Anwendung der .query
Logik würde es in etwa so Aussehen:
df = pd.DataFrame({
'Points': [random.choice([1,3]) for x in range(100)],
'Player': [random.choice(["A","B","C"]) for x in range(100)]})
(df
.query("Points == 3")
.Player.values_count()
.query("> 14")
.hist())
Nur Lösungen finde ich Kraft mich tun, um eine unnötige Belegung und brechen die Verkettung von Methoden:
(points_series = df
.query("Points == 3")
.groupby("Player").size()
points_series[points_series > 100].hist()
Verkettung von Methoden sowie die query-Methode helfen, damit der code lesbar ist inzwischen ist die subsetting-Filterung kann schmutzig ziemlich schnell.
# just to make my point :)
series_bestplayers_under_100[series_prefiltered_under_100 > 0].shape
Bitte helft mir aus meinem dilemma! Dank
- Ich bin mir nicht sicher, ALSO ist der beste Ort für diese Frage, denn es ist eine Frage für die Entwickler der Bibliothek haben, ist es besser zu posten auf github IMO
- Geändert die Frage-Titel mehr SO, Wie
Du musst angemeldet sein, um einen Kommentar abzugeben.
IIUC, die Sie hinzufügen können
query("Points > 100")
:Andere Lösung ist Auswahl Von Callable:
Editiert Antwort von Frage bearbeitet:
DataFrame
. Aber z.B. einpd.DataFrame.value_counts()
gibt eine Reihe, wo Sie Ihre Lösung, die in handliches kommt! Auswahl Von Callable, war mir nicht bewusst - dankeWarum nicht konvertieren von Serie zu DataFrame, führen Sie die Abfrage, und dann wieder zurück konvertieren.
Hier
.to_frame()
konvertiert DataFrame, während der abschließende["Points"]
konvertiert in Serie.Die Methode
.query()
können dann durchgängig verwendet werden, ob oder nicht die Pandas Objekt hat 1 oder mehr Spalten.Statt der Abfrage, die Sie verwenden können
pipe
: