2016-05-03 8 views
0

Ich habe zwei Datenframes df1 und df2, die ich einige Zeilen teilen soll. Das heißt, für einige Indizes ist (i, j) _n df1.loc [i] == df2.loc [j] genau. Ich möchte diese Korrespondenz finden.identifizieren, welche Zeilen in einem anderen Datenframe vorhanden sind

Dies war ein schwieriges Problem zu finden. Ich möchte nicht "manuell" nach jeder der Spalten für jede Zeile fragen, also habe ich nach etwas saubererem gesucht.

Dies ist das Beste, was ich habe, aber es ist nicht schnell. Ich hoffe, dass ein Guru mich in die richtige Richtung lenken kann.

matching_idx=[] 
for ix in df1.index: 
    match =df1.loc[ix:ix].to_dict(orient='list') 
    matching_idx.append(df2.isin(match).all(axis=1) ) 

Es wäre schön, die for-Schleife loszuwerden, aber ich bin mir nicht sicher, dass es möglich ist.

Antwort

1

Angenommen, die Zeilen in jedem Datenrahmen sind eindeutig, können Sie die beiden Datenrahmen verketten und nach Duplikaten suchen.

df1 = pd.DataFrame({'A': ['a', 'b'], 'B': ['a', 'c']})  
df2 = pd.DataFrame({'A': ['c', 'a'], 'B': ['c', 'a']}) 

>>> df1 
    A B 
0 a a 
1 b c 

>>> df2 
    A B 
0 c c 
1 a a 

df = pd.concat([df1, df2]) 

# Returns the index values of duplicates in `df2`. 
>>> df[df.duplicated()] 
    A B 
1 a a 

# Returns the index value of duplicates in `df1`. 
>>> df[df.duplicated(keep='last')] 
    A B 
0 a a 
+0

Ich glaube PYOak hat man in der Einfachheit schlagen – user3391229

+0

Aber Sie verlieren die Indexposition der Zeile das Duplikat enthält. Beachten Sie, dass das erste Beispiel bei "1" indiziert ist, die Position des "dup" in "df1". Das zweite Beispiel ist mit "0" indiziert, der Ort des Duplikats in "df2". – Alexander

+0

Agh du hast Recht. Ich gebe Ihnen die richtige Antwort, um die beste Antwort auf die Frage zu geben, obwohl ich die Lösung von PYOak implementiere. – user3391229

1

Sie können eine Zusammenführung tun, die auf allen Spalten verbindet:

match = df1.merge(df2, on=list(df1.columns)) 
+0

Ich habe eine peinlich lange Zeit versucht, um "Merge" zur Arbeit zu bekommen ... herumalbern mit "Indikator" , "inner" und "on_left" etc. etc. Vielen Dank für die Lösung !! – user3391229

Verwandte Themen