首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >取Dataframe中每组下一个较低的值。

取Dataframe中每组下一个较低的值。
EN

Stack Overflow用户
提问于 2018-03-29 13:07:38
回答 1查看 47关注 0票数 2
代码语言:javascript
复制
          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)不存在,则取下一个较低的B值。在01:00:00组中,最小值为12,但不存在(12 + 10 = 22)。因此,取下一个B值,即18

产出应是:

代码语言:javascript
复制
          A   B     C
0  01:00:00  18  Fred
1  02:00:00  45  Emma

我试过:

代码语言:javascript
复制
df[df.groupby('A')['B'].transform('min') + 10 <= df['B']]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-29 13:17:51

使用带有idxmax的自定义lambda函数返回第一个最大行,并将条件更改为>

代码语言:javascript
复制
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

或者,首先筛选出每个组值较高的所有行,然后按列sort_values B和最后一个仅保留最后一个dupe行的drop_duplicates

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49556909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档