按A列分组选行:基于C列最小值+10规则筛选数据
解决方案:按分组规则筛选指定行
先理清楚需求核心:我们需要按日期(从B列提取日期部分)分组,每组内优先筛选C列等于「该组C最小值+10」的行;如果没有匹配值,就找大于这个目标值的最小C对应的行。
原始数据集
先把给定的数据整理成清晰的表格:
| A | B | C |
|---|---|---|
| 0 | 2002-01-13 15:00:00 | 120 |
| 1 | 2002-01-13 15:30:00 | 110 |
| 2 | 2002-01-13 16:00:00 | 130 |
| 3 | 2002-01-13 16:30:00 | 140 |
| 4 | 2002-01-14 15:00:00 | 180 |
| 5 | 2002-01-14 15:30:00 | 165 |
| 6 | 2002-01-14 16:00:00 | 150 |
| 7 | 2002-01-14 16:30:00 | 170 |
实现思路
- 数据预处理:把
B列转换成日期时间类型,方便提取纯日期作为分组依据。 - 分组筛选逻辑:对每个日期组执行两步判断:
- 先计算组内
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
相关产品推荐
相关产品推荐

