Giới thiệu
Pandas dùng np.nan (NumPy NaN) để biểu diễn giá trị thiếu. Giá trị này có tính chất thú vị: không bằng chính nó (np.nan == np.nan là False). Trong khi None == None là True.
Cách thực hiện
1. Hành vi của np.nan
import pandas as pd
import numpy as np
print(None == None) # True
print(np.nan == np.nan) # False
print(np.nan > 10) # False
2. So sánh DataFrame với toán tử ==
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)
So sánh với giá trị vô hướng:
print(df == "Federer")
So sánh DataFrame với chính nó:
df_compare = df == df
print(df_compare)
Kết quả: cột players toàn True, cột titles có False ở hàng NaN.
3. Kiểm tra .all() cho thấy vấn đề
print(df_compare.all())
# players True
# titles False <- Vấn đề: NaN != NaN
4. Cách sai: so sánh với np.nan
print((df_compare == np.nan).sum()) # Luôn trả về 0 vì NaN != NaN
5. Cách đúng: dùng phương thức .equals()
Phương thức .equals() coi NaN ở cùng vị trí là bằng nhau.
print(df.equals(df)) # True
print(df_compare.equals(df_compare)) # True
Lưu ý: .eq() tương đương ==, không phải .equals().
6. Cách khác: assert_frame_equal (cho unit test)
from pandas.testing import assert_frame_equal
result = assert_frame_equal(df_compare, df_compare)
print(result is None) # True nếu bằng nhau
Hàm này ném AssertionError nếu khác nhau, trả về None nếu giống nhau.