如何通过分组对比找出销售数据库中新增或消失的广告项?
计算每日广告新增/下线数量
首先,你的示例DataFrame如下:
import pandas as pd df = pd.DataFrame({ "offer-id": [1,1,2,2,3,4,5], "date": ["2024-02-10","2024-02-11","2024-02-10","2024-02-11","2024-02-11","2024-02-11","2024-02-10"], "price": [30,10,30,30,20,25,20] })
实现步骤
核心思路是先获取每日的唯一广告集合,再和前一日的集合做对比,计算差异数量。
方法一:利用分组和集合运算
# 按日期分组,提取每日唯一的广告ID集合 daily_offers = df.groupby('date')['offer-id'].apply(set).reset_index(name='active_offers') # 转换日期格式并按时间排序,确保顺序正确 daily_offers['date'] = pd.to_datetime(daily_offers['date']) daily_offers = daily_offers.sort_values('date').reset_index(drop=True) # 获取前一日的广告集合 daily_offers['prev_offers'] = daily_offers['active_offers'].shift(1) # 计算新增广告数:当天存在、前一日不存在的ID数量 daily_offers['new_offers'] = daily_offers.apply( lambda x: len(x['active_offers'] - x['prev_offers']) if pd.notna(x['prev_offers']) else 0, axis=1 ) # 计算下线广告数:前一日存在、当天不存在的ID数量 daily_offers['removed_offers'] = daily_offers.apply( lambda x: len(x['prev_offers'] - x['active_offers']) if pd.notna(x['prev_offers']) else 0, axis=1 ) # 补充每日在线广告总数 daily_offers['total_active'] = daily_offers['active_offers'].apply(len)
运行后得到的结果:
| date | active_offers | prev_offers | new_offers | removed_offers | total_active |
|---|---|---|---|---|---|
| 2024-02-10 | {1, 2, 5} | NaN | 0 | 0 | 3 |
| 2024-02-11 | {1, 2, 3, 4} | {1, 2, 5} | 2 | 1 | 4 |
对应你的需求:2月10日有3个在线广告(无前置日期,故无下线/新增);2月11日有4个在线广告,其中2个为新增(ID3、4),1个已下线(ID5)。
方法二:遍历日期对比(更直观)
如果觉得集合运算不够直观,可以直接遍历每个日期,和前一日的广告列表做对比:
# 先去重,保留每个日期下的唯一广告ID unique_offers = df[['date', 'offer-id']].drop_duplicates() # 按时间顺序排序日期 sorted_dates = sorted(unique_offers['date'].unique()) result_list = [] for idx, current_date in enumerate(sorted_dates): # 获取当日的所有广告ID current_ids = set(unique_offers[unique_offers['date'] == current_date]['offer-id']) total_active = len(current_ids) new_count = 0 removed_count = 0 # 不是第一个日期时,和前一日对比 if idx > 0: prev_date = sorted_dates[idx-1] prev_ids = set(unique_offers[unique_offers['date'] == prev_date]['offer-id']) new_count = len(current_ids - prev_ids) removed_count = len(prev_ids - current_ids) result_list.append({ 'date': current_date, 'total_active': total_active, 'new_offers': new_count, 'removed_offers': removed_count, 'active_offer_ids': current_ids }) # 转换为DataFrame result_df = pd.DataFrame(result_list)
这个方法逻辑更直白,适合需要自定义更多细节的场景。
内容的提问来源于stack exchange,提问作者fußballball
相关产品推荐
相关产品推荐

