如何在Pandas DataFrame中识别日期间ID的新增与删除
解决Pandas中识别不同日期新增/删除ID并生成结果DataFrame的问题
我来帮你搞定这个需求!你需要对比不同日期的ID集合,找出新增和删除的记录,然后整理成指定格式的DataFrame。diff()方法之所以没达到预期,是因为它主要用于计算数值的相邻差异,而我们这里需要的是集合层面的存在性对比,用集合运算会更直接高效。
步骤说明
- 先将原始数据按日期分组,获取每个日期对应的ID集合;
- 确保日期按时间顺序排序(避免原始数据乱序导致对比错误);
- 遍历相邻的日期对,用集合差集找出新增(当前日期有、前一日期无)和删除(前一日期有、当前日期无)的ID;
- 将结果整理成目标格式的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
相关产品推荐
相关产品推荐

