我有一个数据框,其中已拉出最接近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,但是此问题基于用户输入数字而不是数据框中的值。
答案 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']