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)
接下来按照需求实现筛选逻辑,步骤如下:
- 计算B值与15的绝对差值:新增一列
diff,用来衡量每个B值和15的距离 - 分组后按规则排序:按A列分组,每组内先按
diff升序(优先选距离15最近的),再按B列降序(距离相等时选数值更大的) - 提取每组第一行:排序后每组的第一行就是我们需要的结果
对应的代码实现:
# 计算与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
相关产品推荐
相关产品推荐

