按A分组筛选首条符合条件行的Pandas实现问题
Pandas分组筛选:按指定字段分组取首条符合条件行(无符合则取最后一行)
首先帮你理清楚问题,先还原你的数据集(修正了排版导致的列对应问题):
原始数据集:
A | B | Date | C | D 0 | 01:00:00 | 2002-01-16 | 10 | 3 1 | 01:30:00 | 2002-01-16 | 10 | -12 2 | 02:00:00 | 2002-01-16 | 10 | 7 3 | 01:00:00 | 2002-01-17 | 20 | 33 4 | 01:30:00 | 2002-01-17 | 20 | -27 5 | 02:00:00 | 2002-01-17 | 20 | 12
你的需求是:按Date字段(推测你笔误写成了A)分组,每组优先取第一条满足D >= C*0.5 或 D <= -C的行;如果组内没有符合条件的行,就取该组的最后一行。期望输出:
A | B | Date | C | D 1 | 01:30:00 | 2002-01-16 | 10 | -12 3 | 01:00:00 | 2002-01-17 | 20 | 33
你之前尝试了grouped = df.groupby('B'),这是错误的——B是时间字段,分组后每个时间单独成组,完全不符合你的需求,下面是完整的实现方案:
完整代码实现
import pandas as pd # 1. 构造你的数据集 df = pd.DataFrame([ [0, '01:00:00', '2002-01-16', 10, 3], [1, '01:30:00', '2002-01-16', 10, -12], [2, '02:00:00', '2002-01-16', 10, 7], [3, '01:00:00', '2002-01-17', 20, 33], [4, '01:30:00', '2002-01-17', 20, -27], [5, '02:00:00', '2002-01-17', 20, 12] ], columns=['A', 'B', 'Date', 'C', 'D']) # 2. 定义分组处理函数 def select_target_row(group): # 生成筛选掩码:判断每行是否满足条件 condition_mask = (group['D'] >= group['C'] * 0.5) | (group['D'] <= -group['C']) # 过滤出符合条件的行 filtered_rows = group[condition_mask] if not filtered_rows.empty: # 取符合条件的第一行 return filtered_rows.iloc[0] else: # 无符合条件时取组内最后一行 return group.iloc[-1] # 3. 分组并应用处理函数 # 这里按Date分组(如果你实际要按A字段分组,把'Date'改成'A'即可) result = df.groupby('Date').apply(select_target_row).reset_index(drop=True) # 打印结果 print(result)
代码解释
- 数据集构造:先把你的原始数据整理成标准的DataFrame,确保列对应正确;
- 分组处理函数:
- 用
condition_mask生成布尔索引,标记每行是否满足筛选条件; - 过滤后如果有符合条件的行,直接取第一行(
iloc[0]); - 没有符合条件的行时,取该组的最后一行(
iloc[-1]);
- 用
- 分组执行:用
groupby指定正确的分组键(这里是Date,如果你的实际分组键是A,替换即可),再用apply对每个分组执行处理函数,最后reset_index清理索引。
验证结果
运行代码后得到的结果完全符合你的期望:
A B Date C D 0 1 01:30:00 2002-01-16 10 -12 1 3 01:00:00 2002-01-17 20 33
内容的提问来源于stack exchange,提问作者Tie_24
相关产品推荐
相关产品推荐

