DataFrame Spalte unter Bedingung anfügen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
guhamail
User
Beiträge: 14
Registriert: Samstag 19. Februar 2022, 13:34

Hallo,

ich möchte einem DataFrame eine Spalte anfügen, deren Werte von den Daten einer anderen Spalte abhängig sind.

Gegeben sei ein DataFrame:

Code: Alles auswählen

import pandas as pd

df = pd.DataFrame({'Spalte_A': [1, 2, 2, 1, 3, 4, 5, 1],
                   'Spalte_B': ["Sonne", "Mond", "Mond", "Sonne", "Sterne", "Weltall", "Jupiter", "Sonne"]})

Die neu anzufügende Spalte_C soll in Abhängigkeit der Werte in Spalte_A befüllt werden.

Spalte_A = 1 dann Spalte_C = "Warm"
Spalte_A = 2 dann Spalte_C = "kalt"

Bei den übrigen Werten der Spalte_A soll in Spalte_C der Wert aus Spalte_B einfach übernommen werden.

Wie stelle ich das am einfachsten an??

Vielen Dank
Benutzeravatar
__blackjack__
User
Beiträge: 13178
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Eine Möglichkeit:

Code: Alles auswählen

import pandas as pd

df = pd.DataFrame(
    {
        "Spalte_A": [1, 2, 2, 1, 3, 4, 5, 1],
        "Spalte_B": [
            "Sonne",
            "Mond",
            "Mond",
            "Sonne",
            "Sterne",
            "Weltall",
            "Jupiter",
            "Sonne",
        ],
    }
)

series = df["Spalte_A"].map({1: "Warm", 2: "Kalt"})
df["Spalte_C"] = series.where(~series.isna(), df["Spalte_B"])
print(df)
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Sirius3
User
Beiträge: 17787
Registriert: Sonntag 21. Oktober 2012, 17:20

Das geht mit map und fillna:

Code: Alles auswählen

df['Spalte_C'] = df['Spalte_A'].map({1: "Warm", 2: "Kalt"}).fillna(df['Spalte_B'])
aber es scheint ja so, dass jeder Wert eindeutig gemappt werden könnte:

Code: Alles auswählen

df['Spalte_C'] = df['Spalte_A'].map({1: "Warm", 2: "Kalt", 3: "Sterne", 4: "Weltall", 5: "Jupiter"})
Das wäre natürlich der bessere Weg.
guhamail
User
Beiträge: 14
Registriert: Samstag 19. Februar 2022, 13:34

Vielen Dank für eure spontane Hilfe. Das hilft mir weiter.
Benutzeravatar
__blackjack__
User
Beiträge: 13178
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn die Daten tatsächlich in den beiden Spalten so redundant sind, könnte man auch "Sonne" und "Mond" statt 1 und 2 als Grundlage nehmen:

Code: Alles auswählen

In [247]: mapping = {"Sonne": "Warm", "Mond": "Kalt"}

In [248]: df["Spalte_B"].map(lambda text: mapping.get(text, text))
Out[248]: 
0       Warm
1       Kalt
2       Kalt
3       Warm
4     Sterne
5    Weltall
6    Jupiter
7       Warm
Name: Spalte_B, dtype: object
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten