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