我有以下数据帧:
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)
| 归档时间: |
|
| 查看次数: |
12216 次 |
| 最近记录: |