在数据框中查找上方和下方的第二个最接近的数字

时间:2019-01-23 18:44:22

标签: python pandas dataframe

我有一个数据框,其中已拉出最接近t_ave的行,该行是在代码的早期计算的。我现在想向用户展示最佳选择之上和之下的下一个最接近的选项。

df_sc = pd.DataFrame()

df_sc['Diff'] = df_sc.Average.apply(lambda z: t_ave-z)
df_sc['Abs_Diff'] = df_sc.Diff.apply(lambda z: abs(z))
df_sc = df_sc.sort_values(by=['Abs_Diff'])

print('The best option is:', df_sc.iloc[0]['Name']) 

以下是我进行上述排序后的数据框示例:

   Name   Average   Diff     Abs_Diff
2   C5    -11.0     -1.0       1.0
3   C6    -7.5      -4.5       4.5
4   C7    -5.0      -7.0       7.0
1   C4    -22.0     10.0      10.0
0   C3    -26.0     12.0      12.0
5   C8     0.0     -12.0      12.0
6  C10     5.0     -17.0      17.0

这很好地找到了最佳选择(这里是C5),但是我很难找到下一个最佳选择。最初,我尝试使用.drop方法删除最重要的结果,然后找到下一个最接近的结果。但是,尽管这有助于找到下一个最接近的位置,但并不能告诉我它相对于顶部选项Average的哪个方向,因此我无法确定相反方向的下一个最接近的位置。

在当前排序中,t_ave为-15,最佳选项为C5,最接近的较大选项为C6,其Average值为-7.5。最接近的较小选项是C4,其Average值为-22。

存在与此问题类似的问题:Find the closest elements above and below a given number,但是此问题基于用户输入数字而不是数据框中的值。

1 个答案:

答案 0 :(得分:1)

您可以根据Average列过滤DataFrame,然后像上面一样返回结果。

best_average = df_sc.iloc[0]['Average']

name_of_one_bigger = df_sc[df_sc.Average > best_Average].iloc[0]['Name']
name_of_one_smaller = df_sc[df_sc.Average < best_Average].iloc[0]['Name']