ความเท่าเทียมกันของ Pandas DataFrame - การกำหนดหมายเลขดัชนี

การกำหนดหมายเลขดัชนีมีความสำคัญในการทดสอบความเท่าเทียมกันของดาต้าเฟรมหรือไม่ ฉันมี 2 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

person karmanaut    schedule 19.10.2015    source แหล่งที่มา
comment
อาจซ้ำกันของ Pandas DataFrames พร้อมการเปรียบเทียบความเท่าเทียมกันของ NaN   -  person hellpanderr    schedule 20.10.2015


คำตอบ (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))

เช่นเดียวกับในคำตอบที่เกี่ยวข้องนี้

ตามที่ Jeff ชี้ให้เห็นว่าคุณสามารถใช้ .equals ซึ่งทำสิ่งนี้:

In [25]: df1.equals(df3.reset_index(drop=True))
Out[25]: True
person Andy Hayden    schedule 19.10.2015
comment
check_names=False ใช้ไม่ได้ที่นี่ด้วยเหตุผลบางประการ ไอเดียการเรียงลำดับก็ดี! ฉันกำลังลองใช้และจะโพสต์การอัปเดต (และยอมรับคำตอบของคุณ) - person karmanaut; 20.10.2015
comment
check_names ตรวจสอบชื่อดัชนี ฉันคิดว่าซึ่งไม่ควรส่งผลกระทบต่อกรณีของคุณเนื่องจากคุณไม่มีชื่อดัชนีใด ๆ - person Andy Hayden; 20.10.2015
comment
โอ้ คุณหมายถึงใช้ assert หลังจากรีเซ็ตดัชนีใช่ไหม มันไม่ทำงานโดยไม่ทิ้งดัชนี - person karmanaut; 20.10.2015
comment
@AndyHayden เรามี .equals(...) มาระยะหนึ่งแล้ว :) - person Jeff; 20.10.2015
comment
@Jeff ไม่แน่ใจว่าฉันพลาดไปได้อย่างไรเมื่อแท็บเสร็จสิ้นก่อนหน้านี้! :) - person Andy Hayden; 20.10.2015