所以我有一个包含多列的数据框。对于每一列,我想得到第一行的索引,该索引几乎等于用户指定的数字(例如,在所需数字的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,我希望结果是:
我尝试过使用argsort()的方法:
df.iloc[(df.col1-1.0).abs().argsort()[:1]]
根据其他主题,这会给我col1中行的索引,其值最接近1.0。但是,它只返回一个充满nans的数据帧。我还想象这个方法不会给出每列遇到的第一个值接近1,而是最接近1的值。
任何人都可以帮我吗?
答案 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())