แนะนำตัว
Pandas ใช้วัตถุ NumPy NaN (np.nan) เพื่อแสดงค่าที่ขาดหายไป ค่า Numpy NaN นี้มีคุณสมบัติทางคณิตศาสตร์ที่น่าสนใจ เช่น มันไม่เท่ากับตัวมันเอง อย่างไรก็ตาม วัตถุ Python None จะประเมินว่า True เมื่อเปรียบเทียบกับตัวมันเอง
ทำอย่างไร..
ให้เรามาดูตัวอย่างเพื่อทำความเข้าใจว่า np.nan มีพฤติกรรมอย่างไร
import pandas as pd import numpy as np # Python None Object compared against self. print(f"Output \n *** {None == None} ")
ผลลัพธ์
*** True
# Numpy nan compared against self. print(f"Output \n *** {np.nan == np.nan} ")
ผลลัพธ์
*** False
# Is nan > 10 or 1000 ? print(f"Output \n *** {np.nan > 10} ")
ผลลัพธ์
*** False
ตามเนื้อผ้า Series และ DataFrames ใช้ตัวดำเนินการเท่ากับ ==เพื่อทำการเปรียบเทียบ ผลลัพธ์ของการเปรียบเทียบเป็นวัตถุ มาดูวิธีการใช้ตัวดำเนินการเท่ากับก่อน
# create a dataframe with tennis players and their grandslam titles. df = pd.DataFrame(data={"players": ['Federer', 'Nadal', 'Djokovic', 'Murray','Medvedev','Zverev'], "titles": [20, 19, 17, 3,np.nan,np.nan]}) # set the index df.index = df['players'] # sort the index in ascending df.sort_index(inplace=True, ascending=True) # check if the index is set df.index.is_monotonic_increasing # see records print(f"Output \n{df}")
ผลลัพธ์
players titles players Djokovic Djokovic 17.0 Federer Federer 20.0 Medvedev Medvedev NaN Murray Murray 3.0 Nadal Nadal 19.0 Zverev Zverev NaN
1. เพื่อให้เข้าใจมากขึ้น ก่อนอื่นเราจะเปรียบเทียบผู้เล่นทั้งหมดกับค่าสเกลาร์ "เฟเดอเรอร์" และดูผลลัพธ์
print(f'Output \n {df == "Federer"}')
ผลลัพธ์
players titles players Djokovic False False Federer True False Medvedev False False Murray False False Nadal False False Zverev False False
C:\Users\sasan\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py:253: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison res_values = method(rvalues)
2. ใช้งานได้ตามที่คาดไว้ แต่จะเกิดปัญหาเมื่อใดก็ตามที่คุณพยายามเปรียบเทียบ DataFrames กับค่าที่ขาดหายไป หากต้องการสังเกตสิ่งนี้ ให้เราเปรียบเทียบ df กับตนเอง
df_compare = df == df print(f'Output \n {df_compare}')
ผลลัพธ์
players titles players Djokovic True True Federer True True Medvedev True False Murray True True Nadal True True Zverev True False
3. เมื่อมองแวบแรก ค่าทั้งหมดอาจดูเหมือนถูกต้อง อย่างที่คุณคาดไว้ อย่างไรก็ตาม ใช้เมธอด .all เพื่อดูว่าแต่ละคอลัมน์มีเพียงค่า True หรือไม่ (อย่างที่ควรจะเป็นในขณะที่เรากำลังเปรียบเทียบสองออบเจ็กต์ที่คล้ายกันใช่ไหม) ให้ผลลัพธ์ที่ไม่คาดคิด
print(f'Output \n {df_compare.all()}')
ผลลัพธ์
players True titles False dtype: bool
4.ดังที่กล่าวไว้ในบันทึกก่อนหน้านี้ สิ่งนี้เกิดขึ้นเนื่องจากค่าที่หายไปนั้นไม่ได้เปรียบเทียบกันอย่างเท่าเทียมกัน เรารู้อย่างชัดเจนว่า medvedev และ Zverev ไม่มีชื่อ (เช่น NaN) ดังนั้นหากเราเพิ่มจำนวนค่าที่ขาดหายไปในแต่ละคอลัมน์ เราควรได้ค่า 2 สำหรับชื่อและ 0 สำหรับผู้เล่น มาดูกันว่าจะเกิดอะไรขึ้น
print(f'Output \n {(df_compare == np.nan).sum()}')
ผลลัพธ์
players 0 titles 0 dtype: int64
5. เหนือผลลัพธ์ที่คาดไม่ถึงเพราะน่านมีพฤติกรรมแตกต่างกันมาก
6. วิธีที่ถูกต้องในการเปรียบเทียบ DataFrames ทั้งหมด 2 ตัวไม่ใช่ตัวดำเนินการเท่ากับ (==) แต่ใช้วิธี .equals
วิธีนี้จะถือว่า NaN ที่อยู่ในตำแหน่งเดียวกันมีค่าเท่ากัน
หมายเหตุสำคัญ วิธี .eq เทียบเท่ากับ ==ไม่ใช่ .equals
print(f'Output \n {df_compare.equals(df_compare)}')
ผลลัพธ์
True
7. นอกจากนี้ยังมีอีกวิธีหนึ่งในการดำเนินการ หากคุณกำลังพยายามเปรียบเทียบ DataFrames สองรายการซึ่งเป็นส่วนหนึ่งของการทดสอบหน่วยของคุณ ฟังก์ชัน assert_frame_equal จะเพิ่ม AssertionError หาก DataFrames สองอันไม่เท่ากัน คืนค่า None หาก DataFrames ทั้งสองมีค่าเท่ากัน
from pandas.testing import assert_frame_equal print(f'Output \n {assert_frame_equal(df_compare, df_compare) is None}')
ผลลัพธ์
True