Seite 1 von 1

Dataframe Reihe mit Matrix mutiplizieren

Verfasst: Mittwoch 6. Juli 2022, 09:00
von Finn_h
Hallo,

ich möchte eine pandas Dataframe Zeile mit einer Matrix multiplizieren. Die Matrix ergibt sich aber aus Teilen des Dataframes.

Über eine - wahrscheinlich umständliche - for-Schleife löse ich das Problem zwar, aber ich vermute es gibt eine deutlich schlankere Variante.

Code: Alles auswählen

df = pd.DataFrame({"A": [1, 2, 3, 4],
                   "B": [5, 6, 7, 8],
                   "C": [9, 10, 11, 12],
                   "D": [1, 1, 1, 1]})

l = list()
for index, row in df.iterrows():
    l.append(df.loc[index].dot(np.array([[np.sin(df["A"].loc[index]), 0, 0, 0],
                                         [0, np.sign(df["B"].loc[index]), 0, 0],
                                         [0, 0, np.sign(df["C"].loc[index]), 0],
                                         [0, 0, 0, np.tan(df["C"].loc[index])]])))

df[["U", "V", "W", "X"]] = l
print(df)
Danke für die Hilfe.

Re: Dataframe Reihe mit Matrix mutiplizieren

Verfasst: Mittwoch 6. Juli 2022, 09:29
von Sirius3
Du hast keine Matrix-Operation, sondern 4 simple mathematische Operationen, die jeweils nur auf eine Spalte wirken:

Code: Alles auswählen

df["U"] = np.sin(df["A"]) * df["A"]
df["V"] = abs(df["B"])
df["W"] = abs(df["C"])
df["X"] = np.tan(df["C"]) * df["D"]

Re: Dataframe Reihe mit Matrix mutiplizieren

Verfasst: Mittwoch 6. Juli 2022, 10:01
von Finn_h
Danke für die Antwort.

In dem Fall hast du Recht, weil nur auf der Hauptdiagonalen Werte stehen, sind es einfach mathematische Operationen. Wie sieht aber aus, wenn die Nullen mit ähnlichen Werten gefüllt sind?

Re: Dataframe Reihe mit Matrix mutiplizieren

Verfasst: Donnerstag 7. Juli 2022, 09:13
von Finn_h
Falls jemand nochmal über dieses Thread stolpert. Ich habe die gleiche Frage auf Stackoverflow gestellt.
Hier der entsprechende Link:
https://stackoverflow.com/questions/728 ... 6#72887696

Re: Dataframe Reihe mit Matrix mutiplizieren

Verfasst: Donnerstag 7. Juli 2022, 10:03
von Sirius3
@Finn_h: natürlich, wenn Du plötzlich mit ganz anderen Aufgaben kommst, sieht die Lösung auch anders aus.
Erster Schritt ist es, eine große Matrix mit allen Werten zu erzeugen, und diese dann richtig zu multiplizieren:

Code: Alles auswählen

df = pd.DataFrame({
    "A": [1, 2, 3, 4, 6],
    "B": [5, 6, 7, 8, 7],
    "C": [9, 10, 11, 12, 8],
    "D": [1, 1, 1, 1, 1]
})

zeros = np.zeros_like(df["A"])
matrix = np.array([[np.sin(df["A"]), zeros, zeros, np.sin(df["A"])],
                   [zeros, np.sign(df["B"]), zeros, np.abs(df["C"])],
                   [np.sign(df["C"]), zeros, np.sign(df["C"]), zeros],
                   [zeros + 1, zeros + 2, zeros, np.tan(df["C"])]])
result = np.einsum('ij,jki->ik', df[["A", "B", "C", "D"]], matrix)