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的值,指定如何检查差异以及如何进行比较。
极客教程