比较除一个之外的所有列的值

时间:2017-01-14 02:26:59

标签: python pandas dataframe

下面显示的是将列值与常量进行比较的代码。

我的问题:

  1. 为什么"> ="比较显示"错误"行为0.005000" a"。我希望它是真的。
  2. 是否可以重复除第一个和" AND"之外的所有列的比较。结果
  3. 很抱歉无法正确格式化代码。

    import numpy as np  
    import pandas as pd
    
    def test_pct_change():  
    
        MIN_CHANGE = 0.0050 #.5%  For some reason 0.0050 does not work in comparison
    
        data = { 'c1' : pd.Series([100, 110], index=['a', 'b']),
              'c2' : pd.Series([100.5, 105, 3.,], index=['a', 'b', 'c']),
              'c3' : pd.Series([102, 100, 3.], index=['a', 'b', 'c'])}
    
        df = pd.DataFrame(data)
    
        print df.to_string()
    
        dft_pct = df.pct_change(axis=1) #1: columns
        dft_pct['Has_Min_Change'] = (dft_pct.iloc[:, -2] >= MIN_CHANGE) #(dft_pct.iloc[:, -1] >= MIN_CHANGE) & 
        print 'Percent Change'
        print dft_pct.to_string()
    

2 个答案:

答案 0 :(得分:2)

这就是numpy isclose

的原因

考虑数据框df

df = pd.DataFrame(np.random.rand(5, 5))
print(df)

          0         1         2         3         4
0  0.362368  0.201145  0.340571  0.733402  0.816436
1  0.216386  0.105877  0.565318  0.102514  0.451794
2  0.221733  0.216303  0.039209  0.482731  0.800290
3  0.200427  0.154020  0.612884  0.695920  0.122780
4  0.986003  0.059244  0.291480  0.270779  0.526996

评估一个我们知道在数学上是正确的平等

((100 + df) / 100 - 1) == (df / 100)

       0      1      2      3      4
0  False  False  False  False  False
1  False  False  False  False  False
2  False  False  False  False  False
3  False  False  False  False  False
4  False  False  False  False  False

让我们看看差异 我们可以舍入到15位小数,它仍然返回全零 这些非常接近。

print(((100 + df) / 100 - 1).sub(df / 100).round(15))

     0    1    2    3    4
0 -0.0  0.0  0.0  0.0  0.0
1 -0.0  0.0  0.0  0.0  0.0
2 -0.0 -0.0  0.0 -0.0 -0.0
3 -0.0  0.0  0.0 -0.0  0.0
4  0.0 -0.0 -0.0  0.0  0.0

这就是numpy isclose

的原因
np.isclose(((100 + df) / 100 - 1), (df / 100))

array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]], dtype=bool)

这是使用二进制门执行十进制数学的结果,我们有一个解决方法。

答案 1 :(得分:0)

当以双精度执行计算时,100.5 / 100略小于0.005,因此>= MIN_CHANGE - 1e-15的计算结果为False。这就是为什么你没有得到" Min Change"从100改为100.5

如果包含此类边缘情况非常重要,您可以使用dft_pct['Has_Min_Change'] = dft_pct.min(axis=1) >= MIN_CHANGE 之类的不等式略微捏造它。

表示所有列满足> = MIN_CHANGE的条件的一种方法是在列上取最小值,并要求它是> = MIN_CHANGE。例如:

min

默认情况下,doc.toString()会忽略NaN条目。 (注意将布尔值隐式转换为整数,但是:假将其视为0)。

相关问题