2017-12-01 1 views
2

Ich habe zwei Datenrahmen, die ich zu kombinieren versuche. Sie haben jeweils einen Multi-Index, aber diese Indizes haben keine überlappenden Ebenen. Die DFS haben jeweils die gleiche Breite.Wie man zwei unterschiedlich multiindizierte Pandas-Datenrahmen kombiniert, indem man Spalte für Spalte multipliziert

df1

   v1 v2 v3 v4 v5 
location year 
     A 1990 1 3 2 1 4 
     2000 2 5 0 3 1 
     B 1990 6 2 1 2 1 
     2000 3 4 5 0 0 

df2

  v1 v2 v3 v4 v5 
age sex 
    5 M 0 0 1 0 1 
     F 1 0 1 1 1 
10 M 1 0 0 0 0 
     F 0 1 1 0 0 

Ich möchte einen neuen Datenrahmen machen, die Einträge für jede Kombination der beiden Indizes, mit Werten, die gleich dem Produkt der Werte in entsprechenden Spalten :

Ergebnis

     v1 v2 v3 v4 v5 
location year age sex 
     A 1990 5 M 0 0 2 0 4 
        F 1 0 2 1 4 
       10 M 1 0 0 0 0 
        F 0 3 2 0 0 
     2000 5 M 0 0 0 0 1 
        F 2 0 0 3 1 
       10 M 2 0 0 0 0 
        F 0 5 0 0 0 
     B 1990 5 M 0 0 1 0 1 
       .   . 
       .   . 
       etc 

Ich denke, ich könnte die dfs beitreten und dann Spalte für Spalte multiplizieren, aber ich frage mich, ob es eine Möglichkeit gibt, es mehr automatisch zu tun, da Pandas in Multiplikation gebaut ist so viel schneller.

Danke!

+0

Wenn meine Antwort Hilfe Sie es nicht annehmen können oder es upvote. – Wen

Antwort

1

Sie können mit numpy + pandas

df_new=pd.DataFrame(data=np.concatenate(df1.values[:,None]*df2.values), 
      columns=df1.columns, 
      index=np.concatenate(df1.index.values[:,None]+df2.index.values)) 
df_new.index=pd.MultiIndex.from_tuples(df_new.index) 
df_new 
Out[162]: 
      v1 v2 v3 v4 v5 
A 1990 5 M 0 0 2 0 4 
      F 1 0 2 1 4 
     10 M 1 0 0 0 0 
      F 0 3 2 0 0 
    2000 5 M 0 0 0 0 1 
      F 2 0 0 3 1 
     10 M 2 0 0 0 0 
      F 0 5 0 0 0 
B 1990 5 M 0 0 1 0 1 
      F 6 0 1 2 1 
     10 M 6 0 0 0 0 
      F 0 2 1 0 0 
    2000 5 M 0 0 5 0 0 
      F 3 0 5 0 0 
     10 M 3 0 0 0 0 
      F 0 4 5 0 0 
+0

Das hat den Trick - danke! Hast du eine Erklärung, was das macht? – Cliff

+0

@Cliff df1.values ​​[:, None] * df2.values, dies ist die Matrix zu erstellen, mit jedem einzelnen Wert von df1 addiere das ganze df2 – Wen

Verwandte Themen