30

我有以下数据框:

       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

我需要添加一列,指示实际信用> = 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

我正在执行以下操作:

df['result'] = abs(df['actual_credit']) >= abs(df['min_required_credit'])

然而,第 3 行(0.4 和 0.4)不断导致 False。在各个地方研究了这个问题之后,包括:在 Python 中比较浮点数的最佳方法是什么?我仍然无法让它工作。每当两列具有相同的值时,结果为 False,这是不正确的。

我正在使用 python 3.3

4

4 回答 4

41

由于不精确的浮点比较,您可以or与 , 进行比较np.iscloseisclose采用相对和绝对容差参数,因此以下内容应该有效:

df['result'] = df['actual_credit'].ge(df['min_required_credit']) | np.isclose(df['actual_credit'], df['min_required_credit'])
于 2015-11-10T10:05:59.703 回答
7

@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)
   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

您可能会考虑使用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)
   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
于 2021-04-30T15:47:39.653 回答
0

一般来说,numpy 比较函数适用于pd.Series并允许逐元素比较: isclose, allclose, greater, greater_equal,lessless_equal

在你的情况下greater_equal会这样做:

df['result'] = np.greater_equal(df['actual_credit'], df['min_required_credit'])

或者,如建议的那样,使用pandas.ge(或者legt):

df['result'] = df['actual_credit'].ge(df['min_required_credit'])

oring with ge(如上所述)的风险在于,例如比较3.9999999999994.0可能返回True,这可能不一定是您想要的。

于 2020-03-25T18:56:16.200 回答
-3

使用pandas.DataFrame.abs()而不是内置的abs()

df['result'] = df['actual_credit'].abs() >= df['min_required_credit'].abs()
于 2015-11-10T09:29:09.867 回答