2015-11-10 26 views

Trả lời

4

Nếu bạn vượt qua các tham số keys-concat, các cột của dataframe kết quả sẽ bao gồm một đa-index mà theo dõi những dataframes gốc:

In [1]: c=pd.concat([df,df2],axis=1,keys=['df1','df2']) 
     c 

Out[1]: 
    df1   df2 
    a b c a b c 
A na na na 1 na 1 
B na 1 1 na na na 
C na 1 na na 1 na 
D NaN NaN NaN na 1 na 

Kể từ khi các mảng cơ bản bây giờ có giống nhau hình dạng, bây giờ bạn có thể sử dụng để phát sóng == so sánh của bạn và sử dụng như một mặt nạ để trả lại tất cả các giá trị phù hợp:

In [171]: m=c.df1[c.df1==c.df2];m 
Out[171]: 
    a b c 
A NaN NaN NaN 
B NaN NaN NaN 
C NaN 1 NaN 
D NaN NaN NaN 

Nếu giá trị 'na' của bạn đang thực sự số không, bạn có thể sử dụng một ma trận thưa thớt để giảm này đến tọa độ của các giá trị phù hợp (bạn sẽ mất trỏ và tên cột mặc dù):

import scipy.sparse as sp 
print(sp.coo_matrix(m.where(m.notnull(),0))) 
    (2, 1) 1.0 
+0

Câu trả lời rất hay, nhưng tôi nghĩ bạn cần 'bất kỳ' thay vì' tất cả' ở đó. Ngoài ra, OP sẽ vẫn cần tìm cột phù hợp. –

+0

Câu trả lời tuyệt vời

+0

@lev bạn nói đúng, tôi hiểu nhầm câu hỏi của anh ấy, tôi đã chỉnh sửa câu trả lời của mình – maxymoo

0

Nếu bạn chỉ muốn các chỉ số đó là khác nhau, bạn có thể làm: different_indices = [(i,j) for i in range(len((df1 != df2).columns)) for j in range(len(df1 != df2)) if (df1 != df2)[i][j]]

Hoặc, hơi dễ đọc hơn:

m = (df1 != df2) 
different_indices = [(i,j) for i in range(len(m.columns)) for j in range(len(m)) if m[i][j]] 
Các vấn đề liên quan