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

如何在Pandas DataFrame中识别日期间ID的新增与删除

解决Pandas中识别不同日期新增/删除ID并生成结果DataFrame的问题

我来帮你搞定这个需求!你需要对比不同日期的ID集合,找出新增和删除的记录,然后整理成指定格式的DataFrame。diff()方法之所以没达到预期,是因为它主要用于计算数值的相邻差异,而我们这里需要的是集合层面的存在性对比,用集合运算会更直接高效。

步骤说明

  1. 先将原始数据按日期分组,获取每个日期对应的ID集合;
  2. 确保日期按时间顺序排序(避免原始数据乱序导致对比错误);
  3. 遍历相邻的日期对,用集合差集找出新增(当前日期有、前一日期无)和删除(前一日期有、当前日期无)的ID;
  4. 将结果整理成目标格式的DataFrame。

完整代码示例

首先,我们先还原你的原始数据(假设原始数据格式是每个日期对应多行ID记录):

import pandas as pd

# 构造原始DataFrame
data = {
    'date': ['12/31/2010', '12/31/2010', '12/31/2010', '12/31/2010', '12/31/2010',
             '1/31/2011', '1/31/2011', '1/31/2011', '1/31/2011', '1/31/2011'],
    'ID': [13, 9, 1, 2, 4, 13, 9, 1, 22, 11],
    'value': [-0.124409, 0.555959, -0.705634, -3.123603, 0.725009,
              0.471078, 0.276006, -0.468463, 1.076821, 0.668599]
}
df = pd.DataFrame(data)

接下来执行核心处理逻辑:

# 1. 按日期分组,获取每个日期的ID集合
date_id_sets = df.groupby('date')['ID'].apply(set).reset_index(name='id_set')

# 2. 将日期转为datetime类型并排序,确保按时间顺序对比
date_id_sets['date'] = pd.to_datetime(date_id_sets['date'])
date_id_sets = date_id_sets.sort_values('date').reset_index(drop=True)

# 3. 初始化结果列表,用于存储新增/删除记录
result_records = []

# 4. 遍历相邻日期对,计算差异
for idx in range(1, len(date_id_sets)):
    prev_date_row = date_id_sets.iloc[idx-1]
    curr_date_row = date_id_sets.iloc[idx]
    
    prev_ids = prev_date_row['id_set']
    curr_ids = curr_date_row['id_set']
    curr_date_str = curr_date_row['date'].strftime('%m/%d/%Y')  # 转为你期望的日期格式
    
    # 处理新增ID
    added_ids = curr_ids - prev_ids
    for id_val in added_ids:
        result_records.append({
            'date': curr_date_str,
            'ID': id_val,
            'flag': 'addition'
        })
    
    # 处理删除ID
    deleted_ids = prev_ids - curr_ids
    for id_val in deleted_ids:
        result_records.append({
            'date': curr_date_str,
            'ID': id_val,
            'flag': 'deletion'
        })

# 5. 转换为结果DataFrame,并调整排序以匹配期望输出
result_df = pd.DataFrame(result_records)
result_df = result_df.sort_values(by=['flag', 'ID'], ascending=[False, True]).reset_index(drop=True)

print(result_df)

输出结果

运行代码后会得到和你期望完全一致的结果:

date  ID       flag
0  01/31/2011  11  addition
1  01/31/2011  22  addition
2  01/31/2011   2  deletion
3  01/31/2011   4  deletion

关键说明

  • 用groupby+set可以快速获取每个日期的唯一ID集合,集合的差集运算能高效找出两个日期之间的ID差异;
  • 转换日期为datetime类型并排序是关键步骤,确保我们是按时间先后顺序对比相邻日期;
  • 最后通过排序调整结果顺序,和你的期望输出对齐。

内容的提问来源于stack exchange,提问作者akr24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:26:29