代码之家  ›  专栏  ›  技术社区  ›  Mark Harrison

比较两个pandas级数的浮点近似相等?

  •  8
  • Mark Harrison  · 技术社区  · 7 年前

    我可以通过使用 pandas.Series.equals . 是否有相应的函数或参数来检查元素是否等于某些精度?

    4 回复  |  直到 7 年前
        1
  •  10
  •   cs95 abhishek58g    7 年前

    您可以使用 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=...) 
    

    哪里 环礁 公差值

        2
  •  2
  •   bolirev    7 年前

    Numpy与熊猫系列配合得很好。但是,必须注意索引的顺序(或数据帧的列和索引)

    例如

    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

    解决方法是使用一个熊猫系列的索引

    np.allclose(series_1, series_2.loc[series_1.index])
    
        3
  •  1
  •   Prakhar Pandey    5 年前

    如果要避免numpy,还有另一种方法,请使用assert\u series\u 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
    

    这不会引起 断言错误 检查不太精确 仅比较小数点后的3位数字。

    See the docs here

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

        4
  •  1
  •   Sterling bmc    2 年前

    注意:我之所以发布这个帖子,主要是因为我是通过谷歌搜索类似的东西来找到这个帖子的,而且它似乎太长了,无法发表评论。不一定是最好的解决方案,也不一定是严格基于“精度”的解决方案,但如果您希望对向量(即行)而不是对象的标量执行此操作,则可以使用缩放和舍入 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}")