【发布时间】:2019-01-24 04:05:46
【问题描述】:
我有一个数据框,我在其中提取了最接近 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,但这个问题是基于用户输入的数字,而不是数据框中的值。
【问题讨论】:
-
当你说“下一个最佳选择”时,有什么问题,例如
df_sc.iloc[1]['Name']排名第二? -
你卡在哪里了?这些答案不依赖于来自用户输入的值;它们被参数化为来自任何来源的值。
-
df.Abs_Diff.nsmallest(2).iloc[-1]..?? -
或者不选择名称,而是选择索引(对于 C5 为 2),然后递增和递减它。
-
在列表的其余部分,您需要第一个正值和第一个负值。其中之一是
iloc[1]。