Python
 Computer >> コンピューター >  >> プログラミング >> Python

値が欠落しているPythonPandasの2つのDataFrameを比較する方法


はじめに

Pandasは、NumPy NaN(np.nan)オブジェクトを使用して、欠落している値を表します。このNumpyNaN値には、いくつかの興味深い数学的特性があります。たとえば、それ自体と同じではありません。ただし、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} ")
と比較したNumpynan

出力

*** False


# Is nan > 10 or 1000 ?
print(f"Output \n *** {np.nan > 10} ")

出力

*** False

従来、SeriesとDataFrameは、equals演算子==を使用して比較を行います。比較の結果はオブジェクトです。まず、equals演算子の使用方法を見てみましょう。

# 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.これは期待どおりに機能しますが、欠落している値を持つDataFrameを比較しようとすると問題が発生します。これを観察するために、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値のみが含まれているかどうかを確認します(2つの類似したオブジェクトを比較しているので正しいですか?)。

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

出力

players True
titles False
dtype: bool

4.前のメモで述べたように、これは欠落している値が互いに等しく比較されないために発生します。ほら、メドベージェフとズベレフにはタイトルがないこと(つまり、NaN)があることは明らかです。したがって、各列に欠落している値の数を追加すると、タイトルの値は2、プレーヤーの値は0になります。何が起こるか見てみましょう。

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

出力

players 0
titles 0
dtype: int64

5. nanの動作は非常に異なるため、上記の結果は予期しないものです。

6. 2つのDataFrame全体を相互に比較する正しい方法は、equals演算子(==)ではなく、.equalsメソッドを使用することです。

この方法では、同じ場所にあるNaNを等しいものとして扱います。

重要な注意点として、.eqメソッドは.equalsではなく==と同等です。

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

出力

True

7.単体テストの一部として2つのDataFrameを比較しようとしている場合は、別の方法もあります。 2つのDataFrameが等しくない場合、assert_frame_equal関数はAssertionErrorを発生させます。 2つのDataFrameが等しい場合はNoneを返します。

from pandas.testing import assert_frame_equal
print(f'Output \n {assert_frame_equal(df_compare, df_compare) is None}')

出力

True

  1. Pythonで2つのタプルを比較するにはどうすればよいですか?

    タプルは位置ごとに比較されます。最初のタプルの最初のアイテムが2番目のタプルの最初のアイテムと比較されます。それらが等しくない場合、これは比較の結果です。そうでない場合は、2番目の項目が考慮され、次に3番目の項目が考慮されます。 例 >>> a = (1, 2, 3) >>> b = (1, 2, 5) >>> a < b True 類似した異なる要素を考慮に入れた別のタイプの比較があります。これは、セットを使用して実行できます。セットはタプルを取り、一意の値のみを取ります。次に、交差のように機能する&操作を実行して、タプルから共

  2. Pythonで2つのリストを比較するにはどうすればよいですか?

    これを行う最も簡単な方法は、セットを使用することです。セットはリストを取得し、一意の値のみを取得します。次に、交差のように機能する&操作を実行して、リストから共通オブジェクトを取得できます。 例 >>> a = [1, 2, 3, 4, 5] >>> b = [9, 8, 7, 6, 5] >>> set(a) & set(b) {5} set.intersection関数を使用してこの操作を実行することもできます。 例 >>> a = [1, 2, 3, 4, 5] >>> b = [9,