2015-12-22 14 views
8

Mam dwie osobne ramki danych pandy (df1 i df2), które mają wiele kolumn, ale tylko jedną wspólną ("tekst").Pandy porównują dwie ramki danych i usuwają to, co pasuje w jednej kolumnie.

Chciałbym znaleźć każdy wiersz w df2, który nie pasuje do żadnego z wierszy kolumny, które mają wspólne cechy df2 i df1.

DF1

A B text 
45 2 score 
33 5 miss 
20 1 score 

df2

C D text 
.5 2 shot 
.3 2 shot 
.3 1 miss 

Wynik df (usunąć wiersz zawierający panienko ponieważ występuje ona w DF1)

C D text 
.5 2 shot 
.3 2 shot 

Czy możliwe jest użycie metody isin w ten scenariusz?

Odpowiedz

8

Jak prosiłeś, możesz to zrobić skutecznie, używając isin (bez uciekania się do drogich merge s).

>>> df2[~df2.text.isin(df1.text.values)] 
C D text 
0 0.5 2 shot 
1 0.3 2 shot 
+0

To, co przyszło mi do głowy tylko czytając tytuł –

1

EDIT:

import numpy as np 

mergeddf = pd.merge(df2,df1, how="left") 

result = mergeddf[(np.isnan(mergeddf['A']))][['C','D','text']] 
1

Można je połączyć i zachować tylko te linie, które mają Nan.

df2[pd.merge(df1, df2, how='outer').isnull().any(axis=1)] 

lub użyć isin:

df2[~df2.text.isin(df1.text)] 
Powiązane problemy