我正在编写一些单元测试,但是当数据帧在各方面都相同时,它会一直失败。经过一番调查,我发现了
a.equals( a[ a.columns ] )
为false,其中a是我手动创建的数据帧。有什么理由呢?
编辑: 我发现这个问题与使用混合类型列表创建df有关:
a = pd.DataFrame( [['a',1],['b',2]] )
即使列表是混合的,列的dtypes也是正确的。
答案 0 :(得分:2)
我认为你可以使用pd.util.testing.assert_frame_equal()
方法:
In [15]: help(pd.util.testing.assert_frame_equal)
Help on function assert_frame_equal in module pandas.util.testing:
assert_frame_equal(left, right, check_dtype=True, check_index_type='equiv', check_column_type='equiv', check_frame_type=True, check_less_precise
False, check_names=True, by_blocks=False, check_exact=False, check_datetimelike_compat=False, check_like=False, obj='DataFrame')
Check that left and right DataFrame are equal.
Parameters
----------
left : DataFrame
right : DataFrame
check_dtype : bool, default True
Whether to check the DataFrame dtype is identical.
check_index_type : bool / string {'equiv'}, default False
Whether to check the Index class, dtype and inferred_type
are identical.
check_column_type : bool / string {'equiv'}, default False
Whether to check the columns class, dtype and inferred_type
are identical.
check_frame_type : bool, default False
Whether to check the DataFrame class is identical.
check_less_precise : bool, default False
Specify comparison precision. Only used when check_exact is False.
5 digits (False) or 3 digits (True) after decimal points are compared.
check_names : bool, default True
Whether to check the Index names attribute.
by_blocks : bool, default False
Specify how to compare internal data. If False, compare by columns.
If True, compare by blocks.
check_exact : bool, default False
Whether to compare number exactly.
check_dateteimelike_compat : bool, default False
Compare datetime-like which is comparable ignoring dtype.
check_like : bool, default False
If true, then reindex_like operands
obj : str, default 'DataFrame'
Specify object name being compared, internally used to show appropriate
assertion message
如果你想要1.0 == 1,请使用check_dtype=False
,因为在这种情况下,由于不同的dtypes,此方法将返回False
答案 1 :(得分:0)
DataFrame列类型不一样。
a = pd.DataFrame( [['a',1],['b',2]] )
print type(a[ a.columns ].columns)
print type(a.columns)
<class 'pandas.indexes.numeric.Int64Index'>
<class 'pandas.indexes.range.RangeIndex'>
此外
print type(a[ a.columns ].columns[0])
print type(a.columns[0])
<type 'numpy.int64'>
<type 'int'>
最好确保列类型相同。