我有以下数据帧:
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'])
然而,第三行(0.4和0.4)总是导致False。在多个地方研究了这个问题后,包括:在Python中比较几乎相等的浮点值的最佳方法是什么?我还是不能让它发挥作用。只要这两列具有相同的值,结果就会为False,这是不正确的。
我使用的是python 3.3
由于浮点比较不精确,您可以将or
与np.isclose
进行比较,isclose
采用相对和绝对公差参数,因此以下参数应该有效:
df['result'] = df['actual_credit'].ge(df['min_required_credit']) | np.isclose(df['actual_credit'], df['min_required_credit'])
@EdChum的答案很好,但使用熊猫。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
通常,numpy
比较函数与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
可能会返回True
,这可能不一定是您想要的。
使用pandas.DataFrame.abs()
而不是内置的abs()
:
df['result'] = df['actual_credit'].abs() >= df['min_required_credit'].abs()