如何为时间序列数据按日期与product_code分组新增store_locations列?
解决方法
要实现新增store_locations列,统计同一日期下单个商品的售卖门店总数,你需要调整分组维度,同时确保计算结果能映射回原DataFrame的每一行。
问题分析
你原代码的问题在于第二次分组时仅按product_code(level=2)统计,完全忽略了date维度,所以得到的是每个商品在所有日期的总门店数,而非单日数据。
正确实现方式
方法一:使用groupby + transform(推荐)
这种方法最简洁,transform会自动把分组计算的结果广播到原DataFrame的对应行:
df['store_locations'] = df.groupby(['date', 'product_code'])['store_location'].transform('nunique')
- 按
date和product_code组合分组,确保统计的是单日单商品的维度 nunique()用于计算每组内store_location的唯一值数量,也就是售卖门店数transform保证每一行都能获取到对应分组的统计结果,完美匹配目标格式
方法二:先去重再合并
如果需要更直观的分步操作,也可以先去重再计数,最后合并回原表:
# 先去除同一日期、商品、门店的重复记录 unique_records = df.drop_duplicates(['date', 'product_code', 'store_location']) # 按日期和商品分组,统计门店数量 store_counts = unique_records.groupby(['date', 'product_code']).size().rename('store_locations') # 将统计结果合并回原DataFrame df = df.merge(store_counts, on=['date', 'product_code'], how='left')
两种方法都能得到你想要的目标效果:
| date | store_location | product_code | store_locations |
|---|---|---|---|
| 2017-01-01 | Store-A | 100 | 3 |
| 2017-01-01 | Store-B | 100 | 3 |
| 2017-01-01 | Store-C | 100 | 3 |
| 2017-01-01 | Store-D | 200 | 1 |
| 2017-01-02 | Store-D | 200 | 1 |
内容的提问来源于stack exchange,提问作者jayboog321
相关产品推荐
相关产品推荐

