【问题标题】:Pandas - Find the lowest value in range defined by certain values?Pandas - 在某些值定义的范围内找到最低值?
【发布时间】:2023-02-22 01:30:45
【问题描述】:

在其他列中的值定义的范围内找到最低值时,我很挣扎。该范围始终由 boo 列 (1-1、2-2) 中的两个相似值定义,如下图所示。值(boo 列)事先未知(所以我无法列出并比较它们), 因为它们是在前面几步的代码中计算出来的。

数据框示例

    foo           boo
15  36.377949      
16  42.489706     1
17  41.223734      
18  32.281779     0
19  22.888312     2   
20  12.847996      
21   6.876954      
22 -23.872935     1    
23 -31.858878         
24 -39.404905     3   
25 -47.724924     2
26 -4.8161051     3

输出首选作为新的数据框列

    foo           boo    min
15  36.377949      
16  42.489706     1
17  41.223734      
18  32.281779     0      
19  22.888312     2   
20  12.847996      
21   6.876954      
22 -23.872935     1      -23
23 -31.858878         
24 -39.404905     3   
25 -47.724924     2      -47
26 -4.8161051     3      -47

我知道如何使用基本的 for 循环(而不是利用 Pandas 函数和速度)来解决这个问题,所以如果可能的话,我想将其保留在 dataframe/Pandas/Numpy 级别。

有没有办法使用 Pandas/Numpy 来做到这一点?感谢任何 cmets、建议和帮助!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    此代码首先查找出现的索引,如果“boo”列中的值是 nan 或者是第一次出现,则返回 nan。否则返回范围内的最小值。

    def find_min_in_range(row):
        idx = df[df.boo == row["boo"]].index
        if pd.isna(row["boo"]):
            return np.nan
        elif row.name == idx[0]:
            return np.nan
        else:
            return df.loc[range(*(idx)+[0,1]),"foo"].min()
    
    df["min"] = df.apply(find_min_in_range, axis=1)
    

    输出:

    foo boo min
    0 36.3779 nan nan
    1 42.4897 1 nan
    2 41.2237 nan nan
    3 32.2818 0 nan
    4 22.8883 2 nan
    5 12.848 nan nan
    6 6.87695 nan nan
    7 -23.8729 1 -23.8729
    8 -31.8589 nan nan
    9 -39.4049 3 nan
    10 -47.7249 2 -47.7249
    11 -4.81611 3 -47.7249

    【讨论】:

      【解决方案2】:

      由于行重叠,您无法将其完全矢量化,但您可以将循环限制为 boo 中的唯一值:

      for v in df['boo'].dropna().unique():
          m = df['boo'].eq(v)
          s = df.loc[m.cummax() & m[::-1].cummax(), 'foo']
          if len(s)>1:
              df.loc[s.index[-1], 'min'] = s.min()
      print(df)
      

      输出:

                foo  boo        min
      15  36.377949  NaN        NaN
      16  42.489706  1.0        NaN
      17  41.223734  NaN        NaN
      18  32.281779  0.0        NaN
      19  22.888312  2.0        NaN
      20  12.847996  NaN        NaN
      21   6.876954  NaN        NaN
      22 -23.872935  1.0 -23.872935
      23 -31.858878  NaN        NaN
      24 -39.404905  3.0        NaN
      25 -47.724924  2.0 -47.724924
      26  -4.816105  3.0 -47.724924
      

      【讨论】:

        猜你喜欢
        • 2019-11-08
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多