2016-07-07 35 views
7

Làm cách nào tôi có thể chọn sự khác biệt giữa các cột có cùng tên trong hai khung dữ liệu? Tôi có nghĩa là tôi có dataframe A với một cột có tên là X và dataframe B có cột X, nếu tôi làm pd.merge(A, B, on=['X']), tôi sẽ nhận được các giá trị X chung của A và B, nhưng làm cách nào tôi có được các giá trị "không phổ biến" ?"Chống hợp nhất" trong gấu trúc (Python)

+1

bạn chỉ có thể làm '~ A ['X'] .inin (B ['X'])' để xem các giá trị duy nhất cho A và ngược lại để làm ngược lại – EdChum

+0

Ngoài ra tôi nghĩ rằng 'pd.merge (A, B, on = ['X'], chỉ số = True, how = 'outer') 'sẽ làm việc khi nó thêm' _merge' col và giá trị này sẽ có giá trị 'left_only',' right_only' để chỉ ra các giá trị chỉ còn lại/phải – EdChum

Trả lời

14

Nếu bạn thay đổi kiểu hợp nhất để how='outer'indicator=True này sẽ bổ sung thêm một cột để cho bạn biết liệu các giá trị được trái/cả/phải chỉ:

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 

Sau đó bạn có thể lọc kết quả sáp nhập df trên _merge col:

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 

Bạn cũng có thể sử dụng isin và phủ nhận những mặt nạ để tìm giá trị không trong B:

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

Out[5]: 
    x 
0 0 
1 1 
2 2 
Các vấn đề liên quan