2016-07-14 17 views
2

Ich möchte eine bestimmte implementieren Join-Operation, mit folgenden Anforderungen:Pandas kompliziert Join-Operation

ich einen Datenrahmen in folgendem Format haben, wobei der Index Datetime und ich habe Spalten von 0 bis N (9 in diesem Beispiel)

df1:

   0 1 2 3 4 5 6 7 8 9 
2001-01-01 2 53 35 91 43 31 7 87 25 68 
2001-01-02 12 97 86 59 51 7 75 25 6 40 
2001-01-03 73 82 87 1 46 66 17 42 96 61 

I auch einen anderen Datenrahmen, die die Spalten enthält, Datumzeit für jeden Index gewählt werden, das heißt die Werte 0 bis N sind:

  0 
2001-01-01 9 
2001-01-02 5 
2001-01-03 4 

Ich mag würde die zugrundeliegenden Werte des ersten Datenrahmen wählen, wo

index df1 = index df2 
columns df1 = value df2 

Zum Beispiel der Ergebnisse für das obige Beispiel sollen wie folgt aussehen: entlang dieser Linien

join(df1,df2)= 
      0 
2001-01-01 68 
2001-01-02 7 
2001-01-03 46 
+0

So könnten einige Datum Indizes in df2 fehlt es sein, die Teil von DF1 oder umgekehrt sein könnte? Wenn ja, was muss dann das gewünschte Verhalten sein? Könnten Sie einen Beispielfall für solch eine Situation veröffentlichen? – Divakar

Antwort

3

Sie könnenverwenden:

print (df1.lookup(df1.index, df2.iloc[:,0])) 
[68 7 46] 

print (pd.DataFrame(df1.lookup(df1.index, df2.iloc[:,0]), index=df1.index)) 
      0 
2001-01-01 68 
2001-01-02 7 
2001-01-03 46 

Eine andere Lösung mit squeeze:

print (pd.DataFrame(df1.lookup(df1.index, df2.squeeze()), index=df1.index)) 
      0 
2001-01-01 68 
2001-01-02 7 
2001-01-03 46 
+0

Ich würde denken, das wäre schneller, da es keine Konvertierung in Array vermeidet. Und es ist gut, eine NumPy-Alternative für Pandas zu sehen, die so fantasievoll indexiert. – Divakar

3

Etwas von NumPys Indizierungsmethoden übernommen -

vals = df1.values[np.arange(df1.shape[0]),df2[0].values] 
df_out = pd.DataFrame(vals,index=df1.index) 
+0

Es hat funktioniert! danke – motam79

+0

@ motam79 Schau auch in die Lösung von @ jezrael, denn das könnte schneller sein. – Divakar