比较 pandas 列中的浮点数
Comparing floats in a pandas column
我有以下数据框:
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
我需要添加一个列来指示 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
我正在做以下事情:
df['result'] = abs(df['actual_credit']) >= abs(df['min_required_credit'])
但是第 3 行(0.4 和 0.4)总是导致 False。在多个地方研究了这个问题后,包括:What is the best way to compare floats for almost-equality in Python? 我仍然无法让它工作。每当两列具有相同的值时,结果为 False,这是不正确的。
我正在使用 python 3.3
使用 pandas.DataFrame.abs()
而不是内置的 abs()
:
df['result'] = df['actual_credit'].abs() >= df['min_required_credit'].abs()
由于浮动比较不精确,您可以 or
与 np.isclose
的比较,isclose
采用相对和绝对容差参数,因此以下内容应该有效:
df['result'] = df['actual_credit'].ge(df['min_required_credit']) | np.isclose(df['actual_credit'], df['min_required_credit'])
通常 numpy
Comparison 函数与 pd.Series
配合使用效果很好,并允许进行元素比较:
isclose
、allclose
、greater
、greater_equal
、less
、less_equal
等
在你的情况下 greater_equal
会做:
df['result'] = np.greater_equal(df['actual_credit'], df['min_required_credit'])
或者,按照提议,使用 pandas.ge
(或者 le
、gt
等):
df['result'] = df['actual_credit'].ge(df['min_required_credit'])
or
与ge
(如上所述)的风险是,例如比较 3.999999999999
和 4.0
可能 return True
这可能不一定是你想要的。
@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
我有以下数据框:
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
我需要添加一个列来指示 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
我正在做以下事情:
df['result'] = abs(df['actual_credit']) >= abs(df['min_required_credit'])
但是第 3 行(0.4 和 0.4)总是导致 False。在多个地方研究了这个问题后,包括:What is the best way to compare floats for almost-equality in Python? 我仍然无法让它工作。每当两列具有相同的值时,结果为 False,这是不正确的。
我正在使用 python 3.3
使用 pandas.DataFrame.abs()
而不是内置的 abs()
:
df['result'] = df['actual_credit'].abs() >= df['min_required_credit'].abs()
由于浮动比较不精确,您可以 or
与 np.isclose
的比较,isclose
采用相对和绝对容差参数,因此以下内容应该有效:
df['result'] = df['actual_credit'].ge(df['min_required_credit']) | np.isclose(df['actual_credit'], df['min_required_credit'])
通常 numpy
Comparison 函数与 pd.Series
配合使用效果很好,并允许进行元素比较:
isclose
、allclose
、greater
、greater_equal
、less
、less_equal
等
在你的情况下 greater_equal
会做:
df['result'] = np.greater_equal(df['actual_credit'], df['min_required_credit'])
或者,按照提议,使用 pandas.ge
(或者 le
、gt
等):
df['result'] = df['actual_credit'].ge(df['min_required_credit'])
or
与ge
(如上所述)的风险是,例如比较 3.999999999999
和 4.0
可能 return True
这可能不一定是你想要的。
@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