所以我有一个包含多个列的数据框。对于每一列,我想获得第一行的索引,该索引几乎等于用户指定的数字(例如,期望数字的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。但是,它仅返回充满nan的数据帧。我还可以想象这种方法不会使第一个值接近每列遇到的1,而是最接近1的值。
谁能帮我这个?
使用DataFrame.sub
的差异,转换为绝对值通过abs
,通过比较lt
(<
)和第一个值的最后一个GET指数DataFrame.idxmax
:
a = df.sub(1).abs().lt(0.05).idxmax()
print (a)
col1 1
col2 2
col3 0
dtype: int64
但是,对于更通用的解决方案,如果将失败的布尔掩码(容忍度中没有值)附加到由True
s填充的新列(名称为),则可以工作NaN
:
print (df)
col1 col2 col3
ix
0 NaN 0.20 1.07
1 0.98 NaN 1.50
2 1.70 1.03 1.91
3 1.02 1.42 0.87
s = pd.Series([True] * len(df.columns), index=df.columns, name=np.nan)
a = df.sub(1).abs().lt(0.05).append(s).idxmax()
print (a)
col1 1.0
col2 2.0
col3 NaN
dtype: float64
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句