假设我有一个DataFrame df
为
A B r
145 146 99.32
1 10 10
2 20 35
列r
应该是A
与B
的比率,但第三行除外。但是,正如您所看到的,第一行中的这个比率已经四舍五入。
如果我跑
df[df.A/df.B == r]
由于四舍五入,我没有抓到任何行。显然我可以用除法构造列,绕它然后进行比较,但是有没有办法直接从上面的选择指令中做到这一点?
答案 0 :(得分:3)
我会使用np.isclose()方法:
In [32]: df
Out[32]:
A B r
0 3 7 0.420000
1 3 7 0.428571
2 1 2 10.000000
In [33]: df.A/df.B
Out[33]:
0 0.428571
1 0.428571
2 0.500000
dtype: float64
In [34]: np.isclose(df.A/df.B, df.r)
Out[34]: array([False, True, False], dtype=bool)
In [35]: np.isclose(df.A/df.B, df.r, atol=1e-2)
Out[35]: array([ True, True, False], dtype=bool)
In [36]: df.loc[np.isclose(df.A/df.B, df.r, atol=1e-2)]
Out[36]:
A B r
0 3 7 0.420000
1 3 7 0.428571
In [37]: df.loc[np.isclose(df.A/df.B, df.r)]
Out[37]:
A B r
1 3 7 0.428571
非常灵活 - 您可以指定相对或绝对容差:
rtol :float
相对容差参数(见注释)。
atol :float
绝对容差参数(参见注释)。
equal_nan :bool
是否将NaN与之相提并论。如果为True,则a中的NaN将被视为等于输出数组中b中的NaN。