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

วิธีเปรียบเทียบ DataFrames สองรายการใน Python Pandas กับค่าที่หายไป


แนะนำตัว

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