2013-08-31 28 views
14

Tôi đang sử dụng Pandas để so sánh kết quả của hai tập tin được nạp vào hai khung dữ liệu (UAT, prod): ...Pandas "Có thể chỉ so sánh hệt nhãn DataFrame đối tượng" lỗi

uat = uat[['Customer Number','Product']] 
prod = prod[['Customer Number','Product']] 
print uat['Customer Number'] == prod['Customer Number'] 
print uat['Product'] == prod['Product'] 
print uat == prod 

The first two match exactly: 
74357 True 
74356 True 
Name: Customer Number, dtype: bool 
74357 True 
74356 True 
Name: Product, dtype: bool 

Đối in thứ ba, tôi gặp lỗi: Chỉ có thể so sánh các đối tượng DataFrame được gắn nhãn có nhãn. Nếu hai người đầu tiên so sánh tốt, có gì sai với người thứ 3?

Cảm ơn

Trả lời

20

Dưới đây là một ví dụ nhỏ để chứng minh điều này (mà chỉ áp dụng cho DataFrames, không Series, cho đến khi Pandas 0.19, nơi nó được áp dụng cho cả hai):

In [1]: df1 = pd.DataFrame([[1, 2], [3, 4]]) 

In [2]: df2 = pd.DataFrame([[3, 4], [1, 2]], index=[1, 0]) 

In [3]: df1 == df2 
Exception: Can only compare identically-labeled DataFrame objects 

Một giải pháp là sort the index đầu tiên (Lưu ý: some functions require sorted indexes):

In [4]: df2.sort_index(inplace=True) 

In [5]: df1 == df2 
Out[5]: 
     0  1 
0 True True 
1 True True 

Lưu ý: == cũng là sensitive to the order of columns, vì vậy bạn có thể phải sử dụng 012.:

In [11]: df1.sort_index().sort_index(axis=1) == df2.sort_index().sort_index(axis=1) 
Out[11]: 
     0  1 
0 True True 
1 True True 

Lưu ý: Điều này vẫn có thể tăng (nếu chỉ mục/cột không được gắn nhãn chính xác sau khi sắp xếp).

+0

Liên kết loại được bị hỏng. Xin vui lòng sửa lại. –

+0

@ShreyashSSarnayak cảm ơn, loại bỏ tham chiếu đến 'sắp xếp' nó bị loại bỏ khỏi gấu trúc bây giờ (thay thế bằng chỉ' sort_index')! –

10

Bạn cũng có thể thử thả các cột chỉ số nếu nó không phải là cần thiết để so sánh:

print(df1.reset_index(drop=True) == df2.reset_index(drop=True)) 

Tôi đã sử dụng kỹ thuật này cùng trong một thử nghiệm đơn vị như sau:

from pandas.util.testing import assert_frame_equal 

assert_frame_equal(actual.reset_index(drop=True), expected.reset_index(drop=True))