【问题标题】:Finding the second closest number above and below in a dataframe在数据框中查找上下第二个最接近的数字
【发布时间】: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,最接近的较大选项为 C6Average 值为 -7.5。最接近的较小选项是 C4Average 的值为 -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]

标签: python pandas dataframe


【解决方案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']

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 2018-04-09
    • 2021-03-25
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多