2016-07-07 17 views
7

Jak mogę odróżnić kolumny o tej samej nazwie w dwóch ramkach danych? Mam na myśli ramkę danych A z kolumną o nazwie X i ramkę danych B z kolumną o nazwie X, jeśli wykonam pd.merge(A, B, on=['X']), otrzymam wspólne wartości X z A i B, ale jak mogę uzyskać te "niespecjalne" ?"Anti-scalanie" w pandach (Python)

+1

możesz po prostu zrobić '~ A ['X']. Isin (B ['X'])', aby zobaczyć wartości, które są unikalne dla A i odwrotnie, aby zrobić odwrotnie – EdChum

+0

Również myślę, że 'pd.merge (A, B, on = ['X'], wskaźnik = True, how = 'zewnętrzny') 'będzie działało, ponieważ dodaje' _merge' col i będzie miało wartości 'left_only',' right_only', aby wskazać, czy wartości są tylko w lewo/prawo – EdChum

Odpowiedz

14

Jeśli zmienić typ seryjnej do how='outer' i indicator=True to doda kolumnę powiedzieć, czy wartości są w lewo/oba/prawo tylko:

In [2]: 
A = pd.DataFrame({'x':np.arange(5)}) 
B = pd.DataFrame({'x':np.arange(3,8)}) 
print(A) 
print(B) 
    x 
0 0 
1 1 
2 2 
3 3 
4 4 
    x 
0 3 
1 4 
2 5 
3 6 
4 7 

In [3]: 
pd.merge(A,B, how='outer', indicator=True) 

Out[3]: 
    x  _merge 
0 0.0 left_only 
1 1.0 left_only 
2 2.0 left_only 
3 3.0  both 
4 4.0  both 
5 5.0 right_only 
6 6.0 right_only 
7 7.0 right_only 

Następnie można filtrować wypadkowa połączyła df na _merge kol:

In [4]: 
merged = pd.merge(A,B, how='outer', indicator=True) 
merged[merged['_merge'] == 'left_only'] 

Out[4]: 
    x  _merge 
0 0.0 left_only 
1 1.0 left_only 
2 2.0 left_only 

można również użyć isin i negować maskę na znalezienie wartości nie w B:

In [5]: 
A[~A['x'].isin(B['x'])] 

Out[5]: 
    x 
0 0 
1 1 
2 2