Seite 1 von 1

DataFrame Spalte unter Bedingung anfügen

Verfasst: Mittwoch 1. Mai 2024, 19:37
von guhamail
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

Re: DataFrame Spalte unter Bedingung anfügen

Verfasst: Mittwoch 1. Mai 2024, 20:29
von __blackjack__
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)

Re: DataFrame Spalte unter Bedingung anfügen

Verfasst: Mittwoch 1. Mai 2024, 20:29
von Sirius3
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.

Re: DataFrame Spalte unter Bedingung anfügen

Verfasst: Mittwoch 1. Mai 2024, 21:44
von guhamail
Vielen Dank für eure spontane Hilfe. Das hilft mir weiter.

Re: DataFrame Spalte unter Bedingung anfügen

Verfasst: Donnerstag 2. Mai 2024, 09:47
von __blackjack__
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