Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

누락된 값이 있는 Python Pandas의 두 DataFrame을 비교하는 방법

<시간/>

소개

Pandas는 NumPy NaN(np.nan) 객체를 사용하여 누락된 값을 나타냅니다. 이 Numpy NaN 값에는 몇 가지 흥미로운 수학적 속성이 있습니다. 예를 들어, 자신과 같지 않습니다. 그러나 Python None 객체는 자신과 비교할 때 True로 평가됩니다.

그것을 하는 방법..

np.nan이 어떻게 작동하는지 이해하기 위해 몇 가지 예를 살펴보겠습니다.

pdimport numpy as np# Python None으로 판다 가져오기 self.print(f"Output \n *** {None ==None} ")

출력

*** 사실


# Numpy nan과 self.print(f"출력 \n *** {np.nan ==np.nan} ")를 비교한 결과

출력

**** 거짓


# nan> 10 또는 1000입니까?print(f"출력 \n *** {np.nan> 10} ")

출력

**** 거짓

전통적으로 Series 및 DataFrames는 등호 연산자 ==를 사용하여 비교합니다. 비교 결과는 객체입니다. 먼저 등호 연산자를 사용하는 방법을 살펴보겠습니다.

# 테니스 선수와 그들의 그랜드슬램 titles.df =pd.DataFrame(data={"players":['Federer', 'Nadal', 'Djokovic', 'Murray','Medvedev',' Zverev'],"titles":[20, 19, 17, 3,np.nan,np.nan]})# set the indexdf.index =df['players']# 인덱스를 오름차순으로 정렬df.sort_index(inplace =True, Ascending=True)# 인덱스가 setdf.index.is_monotonic_increasing#인지 확인합니다. 

출력

 선수 타이틀선수조코비치 조코비치 17.0페더러 페더러 20.0메드베데프 메드베데프 NaN무레이 머레이 3.0나달 나달 19.0Z베레프 즈베레프 NaN

1. 이해를 돕기 위해 먼저 모든 플레이어를 스칼라 값 "Federer"와 비교하고 결과를 확인합니다.

print(f'출력 \n {df =="페더러"}')

출력

 플레이어 제목playersDjokovic False FalseFederer True FalseMedvedev False FalseMurray False FalseNadal False FalseZverev False False


C:\Users\sasan\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py:253:FutureWarning:요소별 비교에 실패했습니다. 대신 스칼라를 반환하지만 앞으로는 요소별 비교를 수행할 것입니다.res_values ​​=method(rvalues)

2. 이것은 예상대로 작동하지만 DataFrame과 결측값을 비교하려고 할 때마다 문제가 됩니다. 이것을 관찰하기 위해 df와 self를 비교해보자.

df_compare =df ==dfprint(f'출력 \n {df_compare}')

출력

플레이어 타이틀선수Djokovic True TrueFederer True TrueMedvedev True FalseMurray True TrueNadal True TrueZverev True False

3. 언뜻 보기에 모든 값이 예상대로 올바른 것처럼 보일 수 있습니다. 그러나 .all 메서드를 사용하여 각 열에 True 값만 포함되어 있는지 확인합니다(두 개의 유사한 개체를 비교하는 것과 같죠?) 예기치 않은 결과를 생성합니다.

print(f'출력 \n {df_compare.all()}')

출력

선수 Truetitles Falsedtype:bool

4.이전 노트에서 언급했듯이 이것은 결측값이 서로 동등하게 비교되지 않기 때문에 발생합니다. medvedev와 Zverev에는 제목(즉, NaN)이 없다는 것을 분명히 알고 있으므로 각 열에 누락된 값의 수를 추가하면 제목에 대해 2, 플레이어에 대해 0 값을 얻어야 합니다. 무슨 일이 일어나는지 봅시다.

print(f'출력 \n {(df_compare ==np.nan).sum()}')

출력

플레이어 0타이틀 0dtype:int64

5. 위의 결과는 nan이 매우 다르게 동작하기 때문에 예상치 못한 것입니다.

6. 두 개의 전체 DataFrame을 서로 비교하는 올바른 방법은 등호 연산자(==)가 아니라 .equals 메서드를 사용하는 것입니다.

이 방법은 같은 위치에 있는 NaN을 동일하게 취급합니다.

중요한 참고 사항 .eq 메서드는 .equals가 아닌 ==와 동일합니다.

print(f'출력 \n {df_compare.equals(df_compare)}')

출력

사실

7. 단위 테스트의 일부로 두 DataFrames를 비교하려는 경우 수행하는 또 다른 방법이 있습니다. assert_frame_equal 함수는 두 DataFrame이 같지 않으면 AssertionError를 발생시킵니다. 두 DataFrame이 같으면 None을 반환합니다.

pandas.testing에서 import assert_frame_equalprint(f'Output \n {assert_frame_equal(df_compare, df_compare) is None}')

출력

사실