Pandas 缺失值NaN的DataFrame的等值比较

Pandas 缺失值NaN的DataFrame的等值比较

在本文中,我们将介绍如何在Pandas DataFrame中进行NaN的等值比较,因为在处理数据时,缺失值的NaN是经常出现的。

阅读更多:Pandas 教程

数据比较

在处理数据时,经常需要比较两个DataFrame并检查它们的相等性。当涉及到NaN时,这个问题就会变得更加复杂。

首先,2个NaN之间是不相等的。也就是说,np.nan np.nan将返回False。

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'A': [1, 2, np.nan], 'B': [3, np.nan, 4]})
df2 = pd.DataFrame({'A': [1, 2, np.nan], 'B': [3, np.nan, 4]})

print(df1 == df2)

输出的结果将是:

       A      B
0  True   True
1  True  False
2  False  True

在比较两个DataFrame时,如果其中有一个DataFrame有NaN,那么比较的结果将是牢固的等式。

df3 = pd.DataFrame({'A': [1, 2, np.nan], 'B': [3, 4, 5]})
df4 = pd.DataFrame({'A': [1, 2, np.nan], 'B': [3, np.nan, 4]})

print(df3 == df4)

输出的结果将是:

       A      B
0  True   True
1  True  False
2  False  False

在这种情况下,第2行中的数据在df3和df4中不同。由于df3的第2行数据为4,而df4的第2行数据为nan,所以df3df4的结果是False。

使用pandas.testing.assert_frame_equal函数

如果我们希望在两个DataFrame的数据相等性中包括nan,我们可以使用pandas.testing.assert_frame_equal函数。这个函数允许我们指定从哪里应该被认为是等同的-即一个特殊的值,这个值可以与任意它出现的NaN或None进行比较。

import pandas.testing as tm

df5 = pd.DataFrame({'A': [1, 2, np.nan], 'B': [3, np.nan, 4]})
df6 = pd.DataFrame({'A': [1, 2, np.nan], 'B': [3, np.nan, 4]})

tm.assert_frame_equal(df5, df6, check_dtype=False, check_exact=False, check_less_precise=True)

在这种情况下,我们看到一个成功的测试,因为这个函数将两个DataFrame视为完全相同。

如果我们创建一个具有不同NaN值的DataFrame,那么pandas.testing.assert_frame_equal函数将返回失败,并将显示出差异。

df7 = pd.DataFrame({'A': [1, 2, np.nan], 'B': [3, 4, np.nan]})
df8 = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 3]})

tm.assert_frame_equal(df7, df8, check_dtype=False, check_exact=False, check_less_precise=True)

在这种情况下,pandas.testing.assert_frame_equal函数将返回差异和位置。该函数允许我们检查差异,并精确定义偏差量来比较。

try:
    tm.assert_frame_equal(df7, df8, check_dtype=False, atol=0.0)
except AssertionError as e:
    print(e)

这将返回我们差异的列、索引和值。

总结

在处理Pandas DataFrame数据时,NaN值的相等性比较是一个很常见的问题。但是,NaN值的比较是有区别的,因为它与其他值不同。在处理数据时,我们可以使用Pandas.testing.assert_frame_equal函数来比较两个DataFrame的值,指定如何检查差异以及如何进行比较。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程