Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Cách so sánh hai DataFrame trong Pandas khi có giá trị thiếu (NaN)

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.