在单元测试某些函数的上下文中,我试图使用python pandas建立2个DataFrame的相等性:
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
字符串
考虑到我试图测试整个expect
和整个df
,包括NaN
的位置,我做错了什么?
比较包括NaN
s的Series/DataFrames相等性的最简单方法是什么?
7条答案
按热度按时间gdx19jrr1#
你可以使用assert_frame_equals和check_names=False(以免检查索引/列名称),如果它们不相等,则会引发:
字符串
你可以将它 Package 在一个函数中,如下所示:
型
在最近的pandas中,这个功能被添加为
.equals
:型
zz2j4svz2#
NaN
的特性之一是NaN != NaN
是True
。查看this answer,了解使用
numexpr
实现此功能的好方法。字符串
这样说(在伪代码中):
型
因此,要么
a
等于b
,要么a
和b
都是NaN
。如果你有小帧,那么
assert_frame_equal
就可以了。但是,对于大帧(1000万行),assert_frame_equal
几乎没有用处。我不得不打断它,它花了太长时间。型
(推测)所需单个
bool
的timeit
,指示两个DataFrame
是否相等:型
sg2wtvxw3#
喜欢@PhillipCloud的回答,但更多的是写出来的
字符串
它们真的是等价的
型
df 2中不存在于df 1中的nan
型
您也可以填充一个您知道不在框架中的值
型
0h4hbjxa4#
任何使用==与np.NaN的等式比较都是False,即使np.NaN == np.NaN也是False。
简单地说,
df1.fillna('NULL') == df2.fillna('NULL')
,如果'NULL'不是原始数据中的值。为了安全起见,请执行以下操作:
示例a)比较具有NaN值的两个 Dataframe
字符串
示例B)过滤df 1中与df 2不匹配的行
型
(Note:这是错误的- bools[pd.isnull(df 1)== pd.isnull(df 2)] = False)
hwamh0ep5#
字符串
可以使用
fillna()
。Documenation here的数据。型
8wigbo566#
从pandas 1.1.0开始就有了
df.compare(expect)
,如果出现任何差异,它会提供详细的结果。dwbf0jvd7#
米歇尔·德·鲁特尔的答案应该是当前的答案。发布一个答案,因为我没有足够的声誉添加评论。使用数据框架compare方法。
如果
df
和expect
相等(包括NaN位置),df.compare(expect)
将返回空 Dataframe (所有轴均为0长度)。您可以对结果使用empty dataframe属性。字符串