2017-09-05 4 views
2

I zwei Datenrahmen haben, wie folgt aus:Zusammenführen von zwei Datenrahmen durch den Index und Spalten

df1 = pd.DataFrame() 
df1['v1'] = [5,7,2,4,9,7,2] 
df1['v2'] = ["a1", 'nan', "a2", "a3", "a5", "a6", "a9"] 

    v1 v2 
0 5 a1 
1 7 nan 
2 2 a2 
3 4 a3 
4 9 a5 
5 7 a6 
6 2 a9 

und

dfa = pd.DataFrame() 
dfa['pc1'] = np.random.rand(5) 
dfa['pc2'] = np.random.rand(5) 
dfa['idx'] = ["a1", "a2", "a3", "a6", "a9"] 
df2 = dfa.set_index('idx') 

      pc1  pc2 
idx      
a1 0.048725 0.050773 
a2 0.289110 0.302272 
a3 0.720966 0.663910 
a6 0.021616 0.308114 
a9 0.205923 0.583591 

df1 hat eine Spalte v2, die Zeichenwerte enthält, die den Index der DF2 übereinstimmen . Aber es hat auch nan und kann Zeichen enthalten, in denen keine entsprechenden rownames in df2 existieren.

Ich möchte nun diesen Datenrahmen ein, wie dies fusionieren:

v1 v2  pc1  pc2 
0 5 a1 0.048725 0.050773 
1 7 nan  nan  nan 
2 2 a2 0.289110 0.302272 
3 4 a3 0.720966 0.663910 
4 9 a5  nan  nan 
5 7 a6 0.021616 0.308114 
6 2 a9 0.205923 0.583591 

In R ist dies sehr einfach mit den rownames_to_column(df2, "v2") und left_join(df1, .) Funktionen.

Aber wie kann ich es in Pandas machen?

+1

mögliche duplizieren zu [diese Frage] (https://stackoverflow.com/questions/33017452/merging-two-data-frames-based-on-row-values-in-python-pandas) – chrisckwong821

+0

BTW, die 'set_index' call irgendwie kompliziert Dinge. Dies ist nicht erforderlich und Sie können den Join-Parameter für jeden Rahmen separat übergeben. So können Sie immer vermeiden, nach Index zu verbinden, wenn Sie z. 'reset_index()' – Quickbeam2k1

Antwort

2

Sie so etwas wie

pd.merge(df1, df2, left_on = 'v2', right_index=True, how = 'left') 

Daraus ergibt sich tun könnte:

v1 v2  pc1  pc2 
0 5 a1 0.048725 0.050773 
1 7 NaN  NaN  NaN 
2 2 a2 0.28911 0.302272 
3 4 a3 0.720966 0.66391 
4 9 a5  NaN  NaN 
5 7 a6 0.021616 0.308114 
6 2 a9 0.205923 0.583591 
2

UPDATE:

In [37]: df1.merge(df2, right_index=True, left_on='v2', how='outer') 
Out[37]: 
    v1 v2  pc1  pc2 
0 5 a1 0.252062 0.602530 
1 7 nan  NaN  NaN 
2 2 a2 0.328666 0.988321 
3 4 a3 0.704342 0.809817 
4 9 a5  NaN  NaN 
5 7 a6 0.0.602590 
6 2 a9 0.635444 0.926872 

In [33]: df2.merge(df1, left_index=True, right_on='v2', how='outer') 
Out[33]: 
     pc1  pc2 v1 v2 
0 0.252062 0.602530 5 a1 
2 0.328666 0.988321 2 a2 
3 0.704342 0.809817 4 a3 
5 0.0.602590 7 a6 
6 0.635444 0.926872 2 a9 
1  NaN  NaN 7 nan 
4  NaN  NaN 9 a5 
+0

danke, warum sind die Indizes jetzt nicht geordnet, und wie kann ich die Zeilen wieder nach Indizes sortieren? – spore234

+0

@ Spore234, in diesem Fall möchten Sie 'df1' zuerst - siehe aktualisierte Antwort ... – MaxU

0
pd.merge(df2.reset_index(), df1, left_on='idx', right_on='v2', how='outer').drop('idx', axis=1) 


Output: 

      pc1   pc2  v1 v2 
    0  0.760966  0.059443 5  a1 
    1  0.059443  0.984703 2  a2 
    2  0.214868  0.677140 4  a3 
    3  0.224410  0.037784 7  a6 
    4  0.297342  0.341810 2  a9 
    5  NaN   NaN  7  nan 
    6  NaN   NaN  9  a5 
Verwandte Themen