Pandas按日期邻近性筛选:同标题ID分组优化方案咨询
高效实现Pandas自定义分组生成ID字典
你给出的DataFrame如下:
import pandas as pd df = pd.DataFrame({ 'id': [1211, 1212, 1225, 2112, 3122, 1762], 'title': ['jingle bells', 'jingle bells', 'tom boat', 'tom boat', 'tom boat', 'tom boat'], 'date': ['2019-01-15', '2019-01-15', '2019-06-15', '2019-06-15', '2017-03-15', '2017-03-15'] })
需求是定义“条目”为:同一title下,日期与组内首个日期相差不超过70天的ID集合,最终生成类似{0: [1211,1212], 1: [1225,2112], 2: [3122,1762]}的分组字典,且需要替代低效的迭代实现,用更优的Pandas矢量化操作完成。
方案一:适配你的示例场景
从你的示例结果来看,同一title下日期相同的ID被归为一个条目,不同日期的因为间隔远超70天,自然分成不同条目。这种情况下可以直接按title和date分组,一步得到结果:
# 转换日期列为datetime类型(确保分组逻辑准确) df['date'] = pd.to_datetime(df['date']) # 按title和date分组,收集每组的id列表,并重置索引为连续序号 grouped_ids = df.groupby(['title', 'date'])['id'].apply(list).reset_index(drop=True) # 转换为目标字典格式 result_dict = grouped_ids.to_dict()
运行后result_dict就是你想要的结果:{0: [1211, 1212], 1: [1225, 2112], 2: [3122, 1762]}。这个方法完全依托Pandas内置分组操作,避免手动迭代,效率极高,适合处理大规模数据集。
方案二:通用场景(支持同title下多批次近日期数据)
如果你的实际数据中,同一title下存在多个日期,其中部分日期间隔≤70天(比如date1、date2间隔60天,date2和date3间隔60天,但date1和date3间隔120天),此时需要严格按照“与条目内首个日期差≤70天”来分组,我们可以用以下方法:
df['date'] = pd.to_datetime(df['date']) # 按title分组,组内按日期排序,计算每个日期与组内首个日期的天数差 df_sorted = df.sort_values(['title', 'date']).reset_index(drop=True) df_sorted['days_diff'] = df_sorted.groupby('title')['date'].transform(lambda x: (x - x.iloc[0]).dt.days) # 按70天间隔划分条目组:用天数差整除70得到组内分组号 df_sorted['group_id'] = df_sorted.groupby('title')['days_diff'].transform(lambda x: x // 70) # 生成全局唯一的分组序号 df_sorted['global_group'] = df_sorted.groupby(['title', 'group_id']).ngroup() # 收集每个全局组的id列表,转为目标字典 result_dict = df_sorted.groupby('global_group')['id'].apply(list).to_dict()
这个方法全程用Pandas矢量化操作,避免了循环迭代,比手动遍历效率提升几个量级,适合处理百万级以上的数据集。
内容的提问来源于stack exchange,提问作者Jim Eisenberg
相关产品推荐
相关产品推荐

