2015-10-19 126 views
1

索引編號是否在測試數據幀相等方面很重要?我有兩個完全相同的數據和列相同的數據框。唯一的區別是每行的索引號是不同的,等於方法返回一個False。我怎樣才能解決這個問題?這裏是我的數據幀熊貓DataFrame相等 - 索引編號

A B 
0 87 54 
1 87 75 
2 87 22 
3 87 69 

    A B 
418 87 69 
107 87 54 
108 87 75 
250 87 22 
+0

[熊貓DataFrames與NaN的比較平等(的可能的複製http://stackoverflow.com/questions/19322506/pandas- dataframes-with-nans-equality-comparison) – hellpanderrr

回答

1

您可以使用np.array_equal檢查值,但是順序是重要的,所以在你的榜樣,你必須通過索引第一排序。

In [11]: df1 
Out[11]: 
    A B 
0 87 54 
1 87 75 
2 87 22 
3 87 69 

In [12]: df2 
Out[12]: 
     A B 
418 87 69 
107 87 54 
108 87 75 
250 87 22 

In [13]: df3 = df2.sort() 

In [14]: df3 
Out[14]: 
     A B 
107 87 54 
108 87 75 
250 87 22 
418 87 69 

In [15]: np.array_equal(df1, df3) 
Out[15]: True 

注:不能比較DF1和DF2,因爲他們有不同的指標:

In [21]: df1 == df2 
ValueError: Can only compare identically-labeled DataFrame object 

您可以重置索引,但要知道一個例外可以提高該原因:

In [22]: df3.reset_index(drop=True) 
Out[22]: 
    A B 
0 87 54 
1 87 75 
2 87 22 
3 87 69 

In [23]: np.all(df1 == df3.reset_index(drop=True)) 
Out[23]: True 

另一種選擇是有一個嘗試,除塊周圍assert_frame_equals

In [24]: pd.util.testing.assert_frame_equal(df1, df3.reset_index(drop=True)) 

如在此related answer

傑夫指出,你可以使用.equals,它做到這一點:

In [25]: df1.equals(df3.reset_index(drop=True)) 
Out[25]: True 
+0

check_names = False由於某種原因而不起作用。排序想法很好!我正在嘗試它們,並會發布更新(並接受您的回答) – karmanaut

+0

'check_names'會檢查我認爲的索引名稱,因爲您沒有索引名稱,所以不應該影響您的案例。 –

+0

哦,你是否想在重置索引之後使用斷言?沒有刪除索引,它不起作用。 – karmanaut