在pandas DataFrame中查找最接近值的第一行索引

时间:2018-06-13 12:54:05

标签: python pandas dataframe

所以我有一个包含多列的数据框。对于每一列,我想得到第一行的索引,该索引几乎等于用户指定的数字(例如,在所需数字的0.05之内)。数据框看起来像这样:

ix   col1   col2   col3
0    nan    0.2    1.04
1    0.98   nan    1.5
2    1.7    1.03   1.91
3    1.02   1.42   0.97

假设我想要第一行几乎等于1.0,我希望结果是:

  • col1的索引1(不是索引3,即使它们在数学上同样接近1.0)
  • col2的索引2
  • col3的索引0(不是索引3,即使0.97接近1而不是1.04)

我尝试过使用argsort()的方法:

df.iloc[(df.col1-1.0).abs().argsort()[:1]]

根据其他主题,这会给我col1中行的索引,其值最接近1.0。但是,它只返回一个充满nans的数据帧。我还想象这个方法不会给出每列遇到的第一个值接近1,而是最接近1的值。

任何人都可以帮我吗?

2 个答案:

答案 0 :(得分:2)

使用DataFrame.sub表示差异,按abs转化为绝对值,比较lt<),最后得到第一个值的索引DataFrame.idxmax

a = df.sub(1).abs().lt(0.05).idxmax()
print (a)
col1    1
col2    2
col3    0
dtype: int64

但是对于更一般的解决方案,如果失败的布尔掩码(没有值在容差范围内)工作,则会添加由名为True的{​​{1}}填充的新列:

NaN

答案 1 :(得分:1)

假设您有近似的容差值tol 匹配门槛。您可以为其创建掩码数据帧 值低于阈值并使用first_valid_index() 在每列上得到第一次匹配的索引。

tol = 0.05
mask = df[(df - 1).abs() < tol]
for col in df:
    print(col, mask[col].first_valid_index())