Wie extrahiere ich alle duplizierten Zeilen mit einer Bedingung in einem Polars DataFrame richtig?Python

Python-Programme
Anonymous
 Wie extrahiere ich alle duplizierten Zeilen mit einer Bedingung in einem Polars DataFrame richtig?

Post by Anonymous »

Bei einem Polardatenrahmen möchte ich alle duplizierten Zeilen extrahieren und gleichzeitig eine zusätzliche Filterbedingung anwenden, zum Beispiel:

Code: Select all

import polars as pl

df = pl.DataFrame({
"name": ["Alice", "Bob", "Alice", "David", "Eve", "Bob", "Frank"],
"city": ["NY", "LA", "NY", "SF", "LA", "LA", "NY"],
"age": [25, 30, 25, 35, 28, 30, 40]
})

# Trying this:
df.filter((df.is_duplicated()) & (pl.col("city") == "NY"))  # error
Dies führt jedoch zu einem Fehler:

SchemaError: Kann Serie vom Typ Objekt nicht in bool entpacken

Was andeutet, dass df.is_duplicated() eine Reihe vom Typ Objekt zurückgibt, aber in Wirklichkeit ist es ein Boolescher Wert Serie.
Überraschenderweise funktioniert es, wenn man die Prädikate neu anordnet, indem man den Ausdruck zuerst platziert (aber warum?):

Code: Select all

df.filter((pl.col("city") == "NY") & (df.is_duplicated()))  # works!
gibt korrekt aus:

Code: Select all

shape: (2, 3)
┌───────┬──────┬─────┐
│ name  ┆ city ┆ age │
│ ---   ┆ ---  ┆ --- │
│ str   ┆ str  ┆ i64 │
╞═══════╪══════╪═════╡
│ Alice ┆ NY   ┆ 25  │
│ Alice ┆ NY   ┆ 25  │
└───────┴──────┴─────┘
Ich verstehe, dass der optimale Ansatz beim Filtern nach Duplikaten basierend auf einer Teilmenge von Spalten die Verwendung von pl.struct ist, etwa:

Code: Select all

df.filter((pl.struct(df.columns).is_duplicated()) & (pl.col("city") == "NY"))  # works
Was mit der zusätzlichen Filterbedingung gut funktioniert.
Allerdings verwende ich absichtlich nicht pl.struct, da mein echter Datenrahmen 40 Spalten hat und ich anhand aller Spalten außer drei nach doppelten Zeilen suchen möchte, also habe ich Folgendes getan:

Code: Select all

df.filter(df.drop("col1", "col2", "col3").is_duplicated())
Das funktioniert gut und ist viel praktischer, als alle 37 Spalten in eine pl.struct zu schreiben. Dies funktioniert jedoch nicht, wenn rechts eine zusätzliche Filterbedingung hinzugefügt wird, jedoch nicht links:

Code: Select all

df.filter(
(df.drop("col1", "col2", "col3").is_duplicated()) & (pl.col("col5") == "something")
)  # breaks!

df.filter(
(pl.col("col5") == "something") & (df.drop("col1", "col2", "col3").is_duplicated())
)  # works!
Warum spielt in diesem Fall die Reihenfolge der Prädikate (Serie & Ausdruck vs. Ausdruck & Serie) in .filter() eine Rolle?
Ist dieses Verhalten in Polars beabsichtigt oder ein Fehler?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post