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

按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:42:11