2016-06-22 3 views
1

Ich habe zwei Datenrahmen, df1:Python: Wie findet man Werte in einem anderen Datenrahmen?

df1.head(6) 
      t day node s e i r sm em im 
    491325 100 0 0  9 12 21 95 2 4 17 
    491326 100 0 1  8 16 17 140 7 5 40 
    491327 100 0 2  8 9 17 143 0 4 38 
    491328 100 0 3  20 15 37 259 4 7 60 
    491329 100 0 4  8 13 11 85 1 1 20 
    491330 100 0 5  0 4 6 37 0 0 10 

und df2:

df2.head(6) 
    node original  lat  lon  r 
0 0 50405  1.299033 103.83828 0 
1 1 50404  1.299033 103.83828 0 
2 2 50405  1.299033 103.83828 0 
3 3 50402  1.299033 103.83828 0 
4 4 6101  1.299033 103.83828 0 
5 5 9821  1.332867 103.95767 0 

I df2.r basierend auf df1.r aktualisieren möchten, und ich bin eine Schleife zu tun:

for j in df1.index: 
    tmp = df2[df2.node == df1.node[j]] 
    df2.r[tmp.index[0] = df1.r[j] 

Gibt es eine bessere Möglichkeit, die beiden DataFrames zusammenzuführen?

Antwort

0

Ich glaube, Sie merge benötigen, wählen Sie zunächst in df1 nur Spalten r und node und dann drop Spalte r von df2:

print (pd.merge(df2.drop('r', axis=1), df1[['r','node']], on='node')) 
    node original  lat  lon r 
0  0  50405 1.299033 103.83828 95 
1  1  50404 1.299033 103.83828 140 
2  2  50405 1.299033 103.83828 143 
3  3  50402 1.299033 103.83828 259 
4  4  6101 1.299033 103.83828 85 
5  5  9821 1.332867 103.95767 37 
1

Sie merge verwenden können, aber zuerst müssen Sie die Dummy-r Spalte löschen aus df2:

In [11]: del df2["r"] 

In [12]: df2.merge(df1[["r", "node"]]) 
Out[12]: 
    node original  lat  lon r 
0  0  50405 1.299033 103.83828 95 
1  1  50404 1.299033 103.83828 140 
2  2  50405 1.299033 103.83828 143 
3  3  50402 1.299033 103.83828 259 
4  4  6101 1.299033 103.83828 85 
5  5  9821 1.332867 103.95767 37 
+0

Interessant, ist nicht notwendig Parameter 'on' hinzufügen? – jezrael

+0

@jezrael Nun, es ist mehr Python, weil "explizit ist besser als implizit", aber mein Verständnis ist, dass Pandas die Merge-Schlüssel ableiten werden. EDIT: [Die Dokumente bestätigen dies] (http://pandas.pydata.org/pandas-docs/stable/merging.html#database-style-dataframe-joining-merging) "on:' Wenn nicht bestanden und 'left_index 'und' right_index' sind 'False', der Schnittpunkt der Spalten in den DataFrames wird als Join-Schlüssel gewertet" –

+0

@michael_j_ward True (explizit ist besser als implizit), das Problem ist, wenn r in beiden oder if ist Einige Spalten sind dort unerwartet. In diesem Fall übergeben Sie einen zweispaltigen Teilrahmen und wir haben die Spalte r in der obigen Zeile gelöscht. In der Regel ist das Übergeben "on" eine gute Idee. Wenn es andere freigegebene Spalten gibt, werden diese suffi- ziert, so dass selbst dann keine Garantie besteht. –