2016-11-09 4 views
3

Ich habe zwei Datenrahmen. Ich möchte sehen, ob bestimmte Zeilen (in ihrer Gesamtheit) in dem anderen Datenrahmen existieren. Beispiel Zeilen aus df_subset:Überprüfen, ob mehrere Zeilen in einem anderen Datenrahmen existieren

id category value date 
1  A   10  01-01-15 
3  C   10  03-01-15 

Die andere df_full:

id category value date 
1  A   10  01-01-15 
2  B   10  02-01-15 
3  C   10  03-01-15 
4  D   16  04-01-15 

Gibt es irgendwie zu überprüfen, ob die Zeilen eines Datenrahmens in einem anderen existiert? So etwas (offensichtlich funktioniert das nicht): df_subset in df_full, existiert?

> True 

Antwort

3

Ich glaube, Sie merge mit Innen verwenden können beitreten (Standard) mit DataFrame.equals für Vergleichen mit df_subset:

print (pd.merge(df_subset,df).equals(df_subset)) 
True 
+0

einfach und elegant. Danke. – eljusticiero67

2

können Sie merge(..., indicator=True) Methode verwenden:

In [14]: pd.merge(df1, df2, indicator=True, how='outer') 
Out[14]: 
    id category value  date  _merge 
0 1  A  10 01-01-15  both 
1 3  C  10 03-01-15  both 
2 2  B  10 02-01-15 right_only 
3 4  D  16 04-01-15 right_only 
2

mit numpy

(df_subset.values[:, None] == df_full.values).all(2).any(1).all() 

True 

Timing
enter image description here

Erklärung

# using [:, None] to extend into new dimension at 
# take advantage of broadcasting 
a1 = df_subset.values[:, None] == df_full.values 

    # ━> third dimension ━> 
    # ━━━━> axis=2 ━━━> 
# 1st dim 
---->[[[ True True True True] # │ 
     [False False True False] # │ second dimension 
     [False False True False] # │ axis=1 
     [False False False False]] # ↓ 

# axis=0 
---->[[False False True False] # │ 
     [False False True False] # │ second dimension 
     [ True True True True] # │ axis=1 
     [False False False False]]] # ↓ 

# first row of subset with each row of full 
[[[ True True True True] <-- This one is true for all 
    [False False True False] 
    [False False True False] 
    [False False False False]] 

# second row of subset with each row of full 
[[False False True False] 
    [False False True False] 
    [ True True True True] <-- This one is true for all 
    [False False False False]]] 

a2 = a1.all(2) 

# ┌─ first row of subset all equal 
[[ True False False False] 
[False False True False]] 
#    └─ second row of subset all equal 

a3 = a2.any(1) 

# ┌─ first row of subset matched at least one row of full 
[ True True] 
#  └─ second row of subset matched at least one row of full 

a3.all() 

True 

alle Zeilen df_subset SIND IN df_full

+0

wow! es ist wirklich schlau – MaxU

+0

Ich erweiterte Array auf dritte Dimension. alles (2) ist entlang der dritten Achse. Ich werde den Beitrag aktualisieren, um es klarer zu machen – piRSquared

+0

Ja, es ist wirklich kompliziert. Numpy ist für mich kompliziert, ich bevorzuge Pandas. – jezrael

Verwandte Themen