2016-12-22 2 views

Antwort

4

Sie können sie verketten und diejenigen fallen, die nicht kopiert werden:

conc = pd.concat([df1, df2]) 
conc[conc.duplicated(subset=['A', 'B'], keep=False)] 
Out: 
    A B C 
1 2 8 2 
1 2 8 9 

Wenn Sie Duplikate haben,

df1 
Out: 
    A B C 
0 1 2 3 
1 2 8 2 
2 4 7 9 
3 4 7 9 
4 2 8 5 

df2 
Out: 
    A B C 
0 5 6 7 
1 2 8 9 
3 5 6 4 
4 2 8 10 

Sie können Spur der duplizierten diejenigen halten über boolesche Arrays:

cols = ['A', 'B'] 
bool1 = df1[cols].isin(df2[cols].to_dict('l')).all(axis=1) 
bool2 = df2[cols].isin(df1[cols].to_dict('l')).all(axis=1) 

pd.concat([df1[bool1], df2[bool2]]) 
Out: 
    A B C 
1 2 8 2 
4 2 8 5 
1 2 8 9 
4 2 8 10 
+0

Das ist eine Möglichkeit zu haben. oder sogar zu "df2" hinzufügen, denke ich. – Zero

1

Lösung mit Index.intersection, wählen Sie dann Werte in beiden DataFrames von loc und letzte concat sie zusammen:

df1.set_index(['A','B'], inplace=True) 
df2.set_index(['A','B'], inplace=True) 
idx = df1.index.intersection(df2.index) 
print (idx) 
MultiIndex(levels=[[2], [8]], 
      labels=[[0], [0]], 
      names=['A', 'B'], 
      sortorder=0) 

df = pd.concat([df1.loc[idx],df2.loc[idx]]).reset_index() 
print (df) 
    A B C 
0 2 8 2 
1 2 8 9 
1

Hier ist eine weniger effiziente Methode, die Duplikate erhalten sollte, ist aber mit zwei merge/schließt sich

# create a merged DataFrame with variables C_x and C_y with the C values 
temp = pd.merge(df1, df2, how='inner', on=['A', 'B']) 
# join columns A and B to a stacked DataFrame with the Cs on index 
temp[['A', 'B']].join(
      pd.DataFrame({'C':temp[['C_x', 'C_y']].stack() 
       .reset_index(level=1, drop=True)})).reset_index(drop=True) 

Das gibt

A B C 
0 2 8 2 
1 2 8 9 
Verwandte Themen