Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีเปรียบเทียบสอง DataFrames ใน Pandas ที่มีค่า Missing (NaN)

บทนำ

Pandas ใช้ np.nan แทนค่า missing ซึ่งมีคุณสมบัติพิเศษ: np.nan == np.nan เป็น False (ไม่เท่ากับตัวเอง) ในขณะที่ None == None เป็น True

ตัวอย่างพฤติกรรมของ NaN


import pandas as pd
import numpy as np

print(None == None)      # True
print(np.nan == np.nan)  # False
print(np.nan > 10)       # False

ปัญหาการเปรียบเทียบ DataFrame ด้วย ==


df = pd.DataFrame({
    "players": ['Federer', 'Nadal', 'Djokovic', 'Murray', 'Medvedev', 'Zverev'],
    "titles": [20, 19, 17, 3, np.nan, np.nan]
})
df.index = df['players']
df.sort_index(inplace=True)

df_compare = df == df
print(df_compare.all())
# titles column เป็น False เพราะ NaN != NaN

วิธีที่ถูกต้อง: ใช้ .equals()

เมธอด .equals() จัดการ NaN ในตำแหน่งเดียวกันว่าเท่ากัน


print(df.equals(df))           # True
print(df_compare.equals(df_compare))  # True

หมายเหตุ: .eq() เทียบเท่ากับ == ไม่ใช่ .equals()

วิธีสำหรับ Unit Testing: assert_frame_equal


from pandas.testing import assert_frame_equal
assert_frame_equal(df, df)  # ไม่ raise error = เท่ากัน
# คืน None ถ้าเท่ากัน raise AssertionError ถ้าไม่เท่ากัน

สรุป

  • อย่าใช้ == เปรียบเทียบ DataFrame ทั้งตัวที่มี NaN
  • ใช้ .equals() สำหรับการเปรียบเทียบทั่วไป
  • ใช้ assert_frame_equal() สำหรับ unit testing
  • ทั้งสองจัดการ NaN ในตำแหน่งเดียวกันว่าเท่ากัน