Kann ich Daten mit einem einzigen „Wann“ bedingt in mehrere Spalten extrahieren?Python

Python-Programme
Anonymous
 Kann ich Daten mit einem einzigen „Wann“ bedingt in mehrere Spalten extrahieren?

Post by Anonymous »

Wenn ich die folgenden Spielzeugdaten hätte:

Code: Select all

import polars as pl
data = [
{"name_full": "McCartney, Paul"},
{"name_last": "Lennon", "name_first": "John"},
{"name_full": "Starr, Ringo"},
{"name_last": "Harrison", "name_first": "George"}
]
df = pl.DataFrame(data)
df

Code: Select all

shape: (4, 3)
┌─────────────────┬───────────┬────────────┐
│ name_full       ┆ name_last ┆ name_first │
│ ---             ┆ ---       ┆ ---        │
│ str             ┆ str       ┆ str        │
╞═════════════════╪═══════════╪════════════╡
│ McCartney, Paul ┆ null      ┆ null       │
│ null            ┆ Lennon    ┆ John       │
│ Starr, Ringo    ┆ null      ┆ null       │
│ null            ┆ Harrison  ┆ George     │
└─────────────────┴───────────┴────────────┘
Gibt es in Polars eine empfohlene Möglichkeit, die vollständigen Namensdaten in mehrere Spalten aufzuteilen, ohne dass für jede Zielspalte ein separates pl.when erforderlich ist? Es scheint, dass dies mit einer Struktur erreicht werden kann, aber mir gelingt es nicht, die richtige Logik/Syntax zu finden.
Ich kann die gewünschten Ergebnisse mit Folgendem erzielen, aber es ist schwierig, dies für komplexere Daten zu skalieren, da für jede Spalte, in der Daten landen müssen, ein separates pl.when erforderlich ist.

Code: Select all

(
df.with_columns(
pl.col("name_full").str.split(",").list.eval(pl.element().str.strip_chars()).alias("name_parts")
).with_columns(
pl.when(pl.col("name_last").is_null())
.then(pl.col("name_parts").list.get(0, null_on_oob=True))
.otherwise(pl.col("name_last")).alias("name_last"),
pl.when(pl.col("name_first").is_null())
.then(pl.col("name_parts").list.get(1, null_on_oob=True))
.otherwise(pl.col("name_first")).alias("name_first")
).select(pl.all().exclude("name_full", "name_parts"))
)

Code: Select all

shape: (4, 2)
┌───────────┬────────────┐
│ name_last ┆ name_first │
│ ---       ┆ ---        │
│ str       ┆ str        │
╞═══════════╪════════════╡
│ McCartney ┆ Paul       │
│ Lennon    ┆ John       │
│ Starr     ┆ Ringo      │
│ Harrison  ┆ George     │
└───────────┴────────────┘

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post