比较熊猫专栏中的花车

dar*_*ool 18 python pandas

我有以下数据帧:

       actual_credit    min_required_credit
   0   0.3              0.4
   1   0.5              0.2
   2   0.4              0.4
   3   0.2              0.3
Run Code Online (Sandbox Code Playgroud)

我需要添加一个列,指示actual_credit> = min_required_credit的位置.结果将是:

       actual_credit    min_required_credit   result
   0   0.3              0.4                   False
   1   0.5              0.2                   True
   2   0.4              0.4                   True
   3   0.1              0.3                   False
Run Code Online (Sandbox Code Playgroud)

我正在做以下事情:

df['result'] = abs(df['actual_credit']) >= abs(df['min_required_credit'])
Run Code Online (Sandbox Code Playgroud)

但是第3行(0.4和0.4)经常导致False.在各个地方研究这个问题后,包括:在Python中比较浮点数几乎相等的最佳方法是什么?我仍然无法让这个工作.只要两列具有相同的值,结果就是False,这是不正确的.

我正在使用python 3.3

EdC*_*ica 24

由于不精确的浮动比较,你可以or比较np.isclose,isclose采取相对和绝对容差参数,所以以下应该工作:

df['result'] = df['actual_credit'].ge(df['min_required_credit']) | np.isclose(df['actual_credit'], df['min_required_credit'])
Run Code Online (Sandbox Code Playgroud)


小智 9

@EdChum 的答案效果很好,但使用pandas.DataFrame.round函数是另一个干净的选项,无需使用numpy.

df = pd.DataFrame(  # adding a small difference at the thousandths place to reproduce the issue
    data=[[0.3, 0.4], [0.5, 0.2], [0.400, 0.401], [0.2, 0.3]],
    columns=['actual_credit', 'min_required_credit'])

df['result'] = df['actual_credit'].round(1) >= df['min_required_credit'].round(1)
print(df)
Run Code Online (Sandbox Code Playgroud)
   actual_credit  min_required_credit  result
0            0.3                0.400   False
1            0.5                0.200    True
2            0.4                0.401    True
3            0.2                0.300   False
Run Code Online (Sandbox Code Playgroud)

您可能会考虑使用round()更永久地编辑数据框,具体取决于您是否需要这种精度。在这个例子中,OP似乎表明这可能只是噪音,只会引起混乱。

df = pd.DataFrame(  # adding a small difference at the thousandths place to reproduce the issue
    data=[[0.3, 0.4], [0.5, 0.2], [0.400, 0.401], [0.2, 0.3]],
    columns=['actual_credit', 'min_required_credit'])
df = df.round(1)
df['result'] = df['actual_credit'] >= df['min_required_credit']
print(df)
Run Code Online (Sandbox Code Playgroud)
   actual_credit  min_required_credit  result
0            0.3                  0.4   False
1            0.5                  0.2    True
2            0.4                  0.4    True
3            0.2                  0.3   False
Run Code Online (Sandbox Code Playgroud)

  • 是的,但当您使用 `.round(2)` 并以 0.005001 和 0.0049999 为例时应小心。之后你会得到更大的差异... (2认同)
  • @LittleBobbyTables 说的话。此处舍入不是正确的方法。 (2认同)