在Datafram中,每组取下一个较低的值

2024-05-15 14:32:14 发布

您现在位置:Python中文网/ 问答频道 /正文

          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的行
  • 如果(最小值+10)没有´t存在,取下一个较低的B值。示例:在01:00:00组中,最小值是12,但它没有´t存在(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']]

Tags: 距离示例dftransformfredmin条件groupby
1条回答
网友
1楼 · 发布于 2024-05-15 14:32:14

使用带有^{}的自定义lambda函数返回第一个最大行,同时将条件更改为>

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和最后^{}筛选^{},只保留最后一个重复行:

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

相关问题 更多 >