提问人:Mark Harrison 提问时间:10/4/2017 最后编辑:cs95Mark Harrison 更新时间:2/6/2022 访问量:10362
比较两个 pandas 系列的浮点近似相等?
Comparing two pandas series for floating point near-equality?
答:
15赞
cs95
10/4/2017
#1
你可以使用 numpy.allclose
:
numpy.allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)
如果两个数组在容差范围内元素相等,则返回。
True
公差值为正值,通常非常小。这 将相对差 () 和绝对差相加,以与 之间的绝对差进行比较。
rtol * abs(b)
atol
a
b
numpy
适用于对象,因此,如果您有两个对象 - 并且,您可以简单地执行以下操作:pandas.Series
s1
s2
np.allclose(s1, s2, atol=...)
容差值在哪里。atol
3赞
bolirev
1/2/2018
#2
Numpy 与 pandas 系列配合得很好。但是,必须注意索引的顺序(或 pandas DataFrame 的列和索引)
例如
series_1 = pd.Series(data=[0,1], index=['a','b'])
series_2 = pd.Series(data=[1,0], index=['b','a'])
np.allclose(series_1,series_2)
将返回 False
解决方法是使用一个 pandas 系列的索引
np.allclose(series_1, series_2.loc[series_1.index])
1赞
Prakhar Pandey
4/10/2019
#3
如果你想避免numpy,还有另一种方法,使用assert_series_equal
import pandas as pd
s1 = pd.Series([1.333333, 1.666666])
s2 = pd.Series([1.333, 1.666])
from pandas.testing import assert_series_equal
assert_series_equal(s1,s2)
引发一个 .所以使用标志AssertionError
check_less_precise
assert_series_equal(s1,s2, check_less_precise= True) # No assertion error
这不会引发 AS 仅比较小数点后的 3 位数字。AssertionError
check_less_precise
不好使用断言,但如果你想避免numpy,这是一种方法。
评论
1赞
Sterling
2/6/2022
#4
注意:我发布这个主要是因为我通过谷歌搜索类似的东西来到这个线程,它似乎太长了,无法发表评论。不一定是最佳解决方案,也不一定是严格基于“精度ε”的解决方案,但如果您想对向量(即行)而不是标量(而不是)执行此操作而不显式循环,则可以使用缩放和舍入的替代方案:DataFrame
Series
import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
Xcomb = pd.concat((X, X2), axis=0, ignore_index=True)
# scale
scaler = MinMaxScaler()
scaler.fit(Xcomb)
Xscl = scaler.transform(Xcomb)
# round
df_scl = pd.DataFrame(np.round(Xscl, decimals=8), columns=X.columns)
# post-processing
n_uniq = df_scl.drop_duplicates().shape[0]
n_dup = df.shape[0] + df2.shape[0] - n_uniq
print(f"Number of shared rows: {n_dup}")
上一个:浮点值与 0.0 的比较
评论
np.allclose(s1, s2)
设置阈值参数,文档解释得很好。np.isclose()