热门标签:
Q:

比较两个pandas系列的浮点接近相等?

我可以使用pandas.Series.equals比较两个Pandas系列以获得确切的相等性。 是否有相应的函数或参数将检查元素是否等于某些精度?

原网址
A:

您可以使用numpy.allclose:

numpy.allclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)

如果两个数组在公差范围内元素相等,则返回True

公差值为正数,通常是很小的数字。 该 相对差(rtol * abs(b))和绝对差atol 被加在一起,以比较两者之间的绝对差异。 ab

numpypandas.Series对象一起工作得很好,所以如果你有两个对象-s1s2,你可以简单地做:

np.allclose(s1, s2, atol=...) 

其中atol是您的公差值

所有回答

共 3 条

author avatar

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])
author avatar

如果你想避免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)  

引发anAssertionError。 所以使用check_less_precise标志

assert_series_equal(s1,s2, check_less_precise= True)  # No assertion error

这不会引发AssertionError,因为check_less_precise只比较十进制后的3位数字。

请参阅此处的文档

不好使用断言,但如果你想避免numpy,这是一种方法。

author avatar

注意:我发布这个主要是因为我通过谷歌搜索类似的东西来到这个线程,似乎太长了评论。 不一定是最好的解决方案,也不是严格的"精度ε"为基础的,但是如果你想对向量(即行)而不是aDataFrame(而不是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}")

相似问题