DataFrames Pandas avec comparaison d'égalité NaNs
Dans le contexte de l'unité de tester certaines fonctions, je suis en train d'établir l'égalité de 2 DataFrames à l'aide de python pandas:
ipdb> expect
1 2
2012-01-01 00:00:00+00:00 NaN 3
2013-05-14 12:00:00+00:00 3 NaN
ipdb> df
identifier 1 2
timestamp
2012-01-01 00:00:00+00:00 NaN 3
2013-05-14 12:00:00+00:00 3 NaN
ipdb> df[1][0]
nan
ipdb> df[1][0], expect[1][0]
(nan, nan)
ipdb> df[1][0] == expect[1][0]
False
ipdb> df[1][1] == expect[1][1]
True
ipdb> type(df[1][0])
<type 'numpy.float64'>
ipdb> type(expect[1][0])
<type 'numpy.float64'>
ipdb> (list(df[1]), list(expect[1]))
([nan, 3.0], [nan, 3.0])
ipdb> df1, df2 = (list(df[1]), list(expect[1])) ;; df1 == df2
False
Étant donné que je suis en train de tester l'ensemble de expect
contre l'ensemble de df
y compris NaN
positions, ce que je fais mal?
Quel est le moyen le plus simple pour comparer l'égalité de Série/DataFrames y compris NaN
s?
source d'informationauteur Steve Pike
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser assert_frame_equals avec check_names=False (afin de ne pas vérifier les index de noms de colonnes), ce qui va augmenter si elles ne sont pas égales:
Vous pouvez envelopper ce dans une fonction avec quelque chose comme:
Plus récente pandas cette fonctionnalité a été ajoutée en tant que
.égal à
:Une des propriétés de
NaN
est queNaN != NaN
estTrue
.Découvrez cette réponse pour une belle façon de le faire à l'aide de
numexpr
.dit ceci (en pseudo-code):
Donc, soit
a
est égal àb
ou les deuxa
etb
sontNaN
.Si vous avez de petits cadres puis
assert_frame_equal
va être correct. Toutefois, pour les cadres de grande taille (10 MILLIONS de lignes)assert_frame_equal
est assez inutile. J'ai dû l'interrompre, c'était aussi long.timeit
de l' (probablement) souhaitée uniquebool
indiquant si les deuxDataFrame
s sont égaux:Comme @PhillipCloud réponse, mais plus écrit
Ils sont vraiment équivalent
Nan en df2 qui n'existe pas dans df1
Vous pouvez également remplir avec une valeur que vous savez ne pas être dans le cadre
Vous pouvez utiliser
fillna()
. Documenation ici.Toute comparaison d'égalité avec == np.NaN est Faux, même np.NaN == np.NaN est Faux.
Simplement,
df1.fillna('NULL') == df2.fillna('NULL')
si 'NULL' est pas une valeur dans les données d'origine.Pour être sûr, procédez de la manière suivante:
Exemple a) Comparer les deux dataframes avec des valeurs NaN
Exemple b) Filtrer les lignes de df1 qui ne correspondent pas à df2
(Note: c'est faux - bool[pd.isnull(df1) == pd.isnull(df2)] = False)