You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataFrame分组筛选:按规则选取每组B值最接近15的行

解决Pandas分组筛选:选取B值最接近15且差值相等时选较大值的行

咱们先把示例数据用Pandas构造出来:

import pandas as pd

data = {
    'A': ['01:00:00', '01:00:00', '01:00:00', '01:00:00',
          '02:00:00', '02:00:00', '02:00:00', '02:00:00'],
    'B': [24, 28, 12, 18, 17, 35, 45, 14],
    'C': ['Andrew', 'Edd', 'Emma', 'Fred',
          'Andrew', 'Edd', 'Emma', 'Fred']
}
df = pd.DataFrame(data)

接下来按照需求实现筛选逻辑,步骤如下:

  1. 计算B值与15的绝对差值:新增一列diff,用来衡量每个B值和15的距离
  2. 分组后按规则排序:按A列分组,每组内先按diff升序(优先选距离15最近的),再按B列降序(距离相等时选数值更大的)
  3. 提取每组第一行:排序后每组的第一行就是我们需要的结果

对应的代码实现:

# 计算与15的绝对差
df['diff'] = abs(df['B'] - 15)

# 分组排序后取每组第一行,保留原索引
result = df.groupby('A', group_keys=False).apply(
    lambda x: x.sort_values(by=['diff', 'B'], ascending=[True, False]).head(1)
)

# 去掉临时的diff列,还原成期望的输出格式
result = result.drop('diff', axis=1)
print(result)

运行后输出的结果和你期望的完全一致:

A   B     C
3  01:00:00  18  Fred
7  02:00:00  14  Fred

补充说明一下排序逻辑:当两个B值和15的距离相等时(比如01:00:00组里的12和18,和15的差都是3),按B降序排序会让18排在12前面,这样取第一行就符合需求里“选数值较大的”规则。

内容的提问来源于stack exchange,提问作者Tie_24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:04:00