Dataframe Reihe mit Matrix mutiplizieren

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Finn_h
User
Beiträge: 12
Registriert: Samstag 30. Mai 2020, 08:51

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.
Sirius3
User
Beiträge: 17787
Registriert: Sonntag 21. Oktober 2012, 17:20

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"]
Finn_h
User
Beiträge: 12
Registriert: Samstag 30. Mai 2020, 08:51

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?
Finn_h
User
Beiträge: 12
Registriert: Samstag 30. Mai 2020, 08:51

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
Sirius3
User
Beiträge: 17787
Registriert: Sonntag 21. Oktober 2012, 17:20

@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)
Antworten