บทนำ
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 ในตำแหน่งเดียวกันว่าเท่ากัน