按ID分组筛选ref1时间戳大于ref2的ID列表
按分组比较Timestamp筛选ID的Pandas实现方案
示例数据构建
首先构建符合需求的示例DataFrame:
import pandas as pd data = { 'id': ['a1', 'a1', 'a2', 'a2'], 'ref': ['ref1', 'ref2', 'ref1', 'ref2'], 'timestamp': ['2023-10-01 10:00:00', '2023-10-01 11:00:00', '2023-10-02 14:00:00', '2023-10-02 13:00:00'] } df = pd.DataFrame(data) # 必须将timestamp转换为datetime类型才能进行时间比较 df['timestamp'] = pd.to_datetime(df['timestamp'])
方法一:使用Pivot转换结构(简洁高效)
将长表转为宽表,让每个ID对应一行,直接对比ref1和ref2的timestamp列:
# 转宽表:ID为行,ref为列,值为timestamp pivot_df = df.pivot(index='id', columns='ref', values='timestamp').reset_index() # 筛选满足ref1 timestamp > ref2的ID,转为列表 result = pivot_df[pivot_df['ref1'] > pivot_df['ref2']]['id'].tolist() print(result) # 输出:['a2']
适用场景:每个ID恰好包含ref1和ref2各一条记录的情况,代码简洁,执行效率高。
方法二:GroupBy自定义聚合函数(灵活通用)
通过分组后自定义逻辑处理,适合分组内记录数不固定的场景:
def check_ref_timestamp(group): # 提取分组内ref1和ref2的timestamp(假设每组至少各有一条) ref1_ts = group[group['ref'] == 'ref1']['timestamp'].iloc[0] ref2_ts = group[group['ref'] == 'ref2']['timestamp'].iloc[0] return ref1_ts > ref2_ts # 分组应用函数,筛选返回True的ID并转为列表 result = df.groupby('id').apply(check_ref_timestamp)[lambda x: x].index.tolist() print(result) # 输出:['a2']
适用场景:如果分组内存在多条ref1或ref2记录,可以修改逻辑(比如取最大/最小timestamp),灵活性更强。
内容的提问来源于stack exchange,提问作者adss4
相关产品推荐
相关产品推荐

