DataFrame Spalte unter Bedingung anfügen

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

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: 14336
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)
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Sirius3
User
Beiträge: 18375
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: 22
Registriert: Samstag 19. Februar 2022, 13:34
Wohnort: Brandenburg

Vielen Dank für eure spontane Hilfe. Das hilft mir weiter.
Benutzeravatar
__blackjack__
User
Beiträge: 14336
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
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Antworten