2017-08-24 4 views
-1

Comment puis-je combiner 2 dataframe df1 et df2 afin d'obtenir df3 qui a les lignes de df1 et df2 qui ont le même indice (et les mêmes valeurs dans les colonnes)?tranches qui sont Extraction identiques entre deux dataframes

df1 = pd.DataFrame({'A': ['A0', 'A2', 'A3', 'A7'], 
         'B': ['B0', 'B2', 'B3', 'B7'], 
         'C': ['C0', 'C2', 'C3', 'C7'], 
         'D': ['D0', 'D2', 'D3', 'D7']}, 
         index=[0, 2, 3,7]) 

essai 1

df2 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A7'], 
        'B': ['B0', 'B1', 'B2', 'B7'], 
        'C': ['C0', 'C1', 'C2', 'C7'], 
        'D': ['D0', 'D1', 'D2', 'D7']}, 
        index=[0, 1, 2, 7]) 

essai 2

df2 = pd.DataFrame({'A': ['A1'], 
        'B': ['B1'], 
        'C': ['C1'], 
        'D': ['D1']}, 
        index=[1]) 

test de sortie attendu 1

Out[13]: 
    A B C D 
0 A0 B0 C0 D0 
2 A2 B2 C2 D2 
7 A7 B7 C7 D7 

test de sortie attendu 2

Empty DataFrame 
Columns: [A, B, C, D] 
Index: [] 
+0

oui, une option pourrait être d'utiliser concat, mais il ne vérifie pas les valeurs .. – gabboshow

+0

Certaines de nos réponses ont-elles fonctionné? –

Répondre

1

D'abord, obtenez l'intersection des indices. Ensuite, trouvez toutes les lignes où toutes les colonnes sont identiques, puis indexez-les dans l'une ou l'autre des données.

idx = df1.index & df2.index 
df_out = df1.loc[(df1.loc[idx] == df2.loc[idx]).all(1).index] 

print(df_out) 

Vous pouvez également utiliser df.isin (légèrement différent de l'autre réponse):

df_out = df1[df1.isin(df2).all(1)] 
print(df_out) 

Essai 1

A B C D 
0 A0 B0 C0 D0 
2 A2 B2 C2 D2 
7 A7 B7 C7 D7 

Test 2

Empty DataFrame 
Columns: [A, B, C, D] 
Index: [] 
0

Je crois que c'est amore solution pythonique:

df1[df2.isin(df1)].dropna() 

donne:

A B C D 
0 A0 B0 C0 D0 
2 A2 B2 C2 D2 
7 A7 B7 C7 D7 
0
pd.merge(df1.reset_index(), df2.reset_index()).set_index('index') 

Cela ajoute l'indice de chaque trame de données comme une colonne, puis rejoint sur toutes les colonnes (qui inclut maintenant l'index), puis définit l'index pour revenir aux valeurs d'origine.

0

Ou vous pouvez essayer ceci.

Pour le test 1

df1['index']=df1.index 
df2['index']=df2.index 
df1['Mark']=df1.apply(lambda x : ' '.join(x.astype(str)),axis=1) 
df2['Mark']=df2.apply(lambda x : ' '.join(x.astype(str)),axis=1) 
df1[df1.Mark.isin(df2.Mark)].drop(['Mark','index'],1) 


Out[20]: 
    A B C D 
0 A0 B0 C0 D0 
2 A2 B2 C2 D2 
7 A7 B7 C7 D7 

Pour le test 2

Out[28]: 
Empty DataFrame 
Columns: [A, B, C, D] 
Index: []