【问题标题】:Take the next lower value per each group in Dataframe在 Dataframe 中为每组取下一个较低的值
【发布时间】:2018-09-08 11:04:04
【问题描述】:
          A   B       C
0  01:00:00  24  Andrew
1  01:00:00  17     Edd
2  01:00:00  12    Emma
3  01:00:00  18    Fred
4  02:00:00  38  Andrew
5  02:00:00  35     Edd
6  02:00:00  45    Emma
7  02:00:00  49    Fred

我想为每个A 组选择一行,条件如下:

  • 取距离最小值为10的行。示例:在02:00:00组中,B最小值为35,因此取值为(35 + 10= 45)B值的行。李>
  • 如果 (minimum + 10) 不存在,则取下一个较低的 B 值。示例:在01:00:00 组中,最小值为 12,但它不存在 (12 + 10 = 22)。所以取下一个较低的 B 值,即18

输出应该是:

          A   B     C
0  01:00:00  18  Fred
1  02:00:00  45  Emma

我试过了:

df[df.groupby('A')['B'].transform('min') + 10 <= df['B']]

【问题讨论】:

    标签: python pandas conditional


    【解决方案1】:

    使用带有idxmax 的自定义 lambda 函数返回第一个最大行,同时将条件更改为 &gt;

    i = (df.sort_values('B', ascending=False)
          .groupby('A')['B']
          .apply(lambda x: ((x.min() + 10 >= x).idxmax())))
    df = df.loc[i]
    print (df)
              A   B     C
    3  01:00:00  18  Fred
    6  02:00:00  45  Emma
    

    或者首先过滤掉每组具有较高值的​​所有行,然后按列B 过滤掉sort_values,最后过滤掉drop_duplicates,只保留最后一个重复行:

    df1 = df[df.groupby('A')['B'].transform('min') + 10 >= df['B']]
    df1 = df1.sort_values('B').drop_duplicates('A', keep='last')
    print (df1)
              A   B     C
    3  01:00:00  18  Fred
    6  02:00:00  45  Emma
    

    【讨论】:

      猜你喜欢
      • 2020-04-05
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2020-02-21
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多