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

按A列分组选行:基于C列最小值+10规则筛选数据

解决方案:按分组规则筛选指定行

先理清楚需求核心:我们需要按日期(从B列提取日期部分)分组,每组内优先筛选C列等于「该组C最小值+10」的行;如果没有匹配值,就找大于这个目标值的最小C对应的行。

原始数据集

先把给定的数据整理成清晰的表格:

ABC
02002-01-13 15:00:00120
12002-01-13 15:30:00110
22002-01-13 16:00:00130
32002-01-13 16:30:00140
42002-01-14 15:00:00180
52002-01-14 15:30:00165
62002-01-14 16:00:00150
72002-01-14 16:30:00170

实现思路

  1. 数据预处理:把B列转换成日期时间类型,方便提取纯日期作为分组依据。
  2. 分组筛选逻辑:对每个日期组执行两步判断:
    • 先计算组内C的最小值,得到目标值min_c + 10,筛选C等于该值的行,存在则直接返回。
    • 若没有匹配行,筛选出C大于目标值的所有行,按C升序排序后取第一行(也就是大于目标值的最小C对应的行)。

代码实现(Python Pandas)

import pandas as pd

# 构造原始数据集
data = {
    'A': [0,1,2,3,4,5,6,7],
    'B': ['2002-01-13 15:00:00', '2002-01-13 15:30:00', '2002-01-13 16:00:00', '2002-01-13 16:30:00',
          '2002-01-14 15:00:00', '2002-01-14 15:30:00', '2002-01-14 16:00:00', '2002-01-14 16:30:00'],
    'C': [120,110,130,140,180,165,150,170]
}
df = pd.DataFrame(data)

# 转换B列为datetime类型,提取日期作为分组键
df['B'] = pd.to_datetime(df['B'])
df['group_key'] = df['B'].dt.date

# 定义分组筛选函数
def pick_target_row(group):
    min_c = group['C'].min()
    target_value = min_c + 10
    
    # 优先匹配等于目标值的行
    match_rows = group[group['C'] == target_value]
    if not match_rows.empty:
        return match_rows.iloc[0]
    
    # 无匹配时,找大于目标值的最小C对应的行
    filtered_rows = group[group['C'] > target_value]
    return filtered_rows.sort_values('C').iloc[0]

# 应用分组筛选并整理结果
result = df.groupby('group_key').apply(pick_target_row).reset_index(drop=True)
result = result[['A', 'B', 'C']]

# 打印结果
print(result)

执行结果

运行代码后会得到预期输出:

A                   B    C
0  0 2002-01-13 15:00:00  120
1  5 2002-01-14 15:30:00  165

逻辑验证

  • 第一组(2002-01-13):C列最小值为110,目标值120,刚好存在C=120的行(A=0),直接选中。
  • 第二组(2002-01-14):C列最小值为150,目标值160,组内无匹配值;大于160的C值有165、170、180,最小的是165,对应A=5的行,因此选中该行。

内容的提问来源于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.20 10:40:40