2017-02-14 13 views
1

Ich habe zwei Datenrahmen, zum Beispiel:Rundfunk Multiplikation von zwei Pandas Datenrahmen

df1 = pn.DataFrame(np.arange(6).reshape(3, 2), columns=['A1', 'B1']) 
df2 = pn.DataFrame(np.arange(1,7).reshape(3, 2), columns=['A2', 'B2']) 

    A1 B1 
0 0 1 
1 2 3 
2 4 5 

    A2 B2 
0 1 2 
1 3 4 
2 5 6 

Ich brauche von Spalt DF1 und DF2 multipliziert, um einen Datenrahmen mit folgenden Ergebnissen zu erhalten:

A1*A2 A1*B2 B1*A2 B1*B2 
0  0  0  1  2 
1  6  8  9  12 
2 20  24  25  30 

Größen von df1 und df2 in der realen Aufgabe sind (1000 Spalten x 90 000 Zeilen).

Ich möchte nicht doppelten "für" Zyklus über Spalten dieser DataFrames verwenden.

Gibt es eine eingebaute Funktion oder eine einfache Methode, um sie zu berechnen?

+0

Es sieht aus wie ein Polynom mit Spalten verschiedener Datenrahmen, aber nicht mit Spalten einzelner Datenrahmen – Somnambula

Antwort

0

Verwenden broadcasting für eine effiziente Leistungssteigerung:

import itertools 

df = pd.DataFrame((df1.values[..., None] * df2.values[:, None]).reshape(df1.shape[0],-1)) 
df.columns = ["*".join(i) for i in itertools.product(*[df1.columns, df2.columns])] 

enter image description here


Der Zweck df1.values[..., None] der Einbeziehung ist eine zusätzliche Dimension in die richtige Form mit (3, 2, 1) aus früheren (3, 2) Form von df1.values zu erstellen.

Darüber hinaus fügt df2.values[:, None] eine zusätzliche Dimension in Richtung der Mittelachse hinzu, so dass seine Form (3, 1, 2) von Anfang (3,2) wird, um den Multiplikationsprozess zu unterstützen.

Schließlich reshape sie auf die gleiche Anzahl von Zeilen wie die des ursprünglichen df1 (oder) df2
(da beide die gleiche Form teilen in der Frage erwähnt) zu nehmen.

+1

Ausgezeichnet! Ich mag es wirklich)) Ich brauche etwas Zeit, um das Konzept der Arbeit mit Daten in Python zu ändern, weil Python eine neue Programmiersprache für mich ist. Vielen Dank!!! – Somnambula

+0

Wenn der Einsatz von Rundfunk in diesem Stadium überwältigend scheint, würde ich [diesen Beitrag] (http://scipy.github.io/old-wiki/pages/EricsBroadcastingDoc) eine gute Lektüre empfehlen, um diese Konzepte zu verstehen. –

0

können Sie verwenden df.multiply() mit einer Reihe zu multiplizieren df und dann Concat die resultierenden Datenrahmen wie folgt aus:

df3 = pd.concat([df1[["A1", "B1"]].multiply(df2["A2"], axis="index"), 
df1[["A1", "B1"]].multiply(df2["B2"], axis="index")], axis = 1) 

df3.columns = ['A1*A2', "B1*A2", "A1*B2", "B1*B2"] 

Sie erhalten:

 A1*A2 B1*A2 A1*B2 B1*B2 
0  0  1  0  2 
1  6  9  8  12 
2  20  25  24  30 
+0

Vielen Dank !! Ihre Lösung funktioniert und klarer für mich als Java-Entwickler – Somnambula

Verwandte Themen