如何基于5个层级列对pandas DataFrame按产品层级路径抽样
分层级抽样商品并过滤数据集实现方法
你提出的拼接层级字段作为分组依据的思路是可行的,实际实现时注意避免层级拼接重名、避免直接对日度行抽样导致重复商品的问题即可,完整流程如下:
核心实现逻辑
- 拼接5个层级字段生成唯一层级路径标识,拼接时建议加入特殊分隔符(比如
|),避免不同层级的文本直接拼接出现重名冲突 - 先提取「层级路径-商品ID」的唯一映射表,不需要直接对5年跨度的全量日度行做分组,减少计算量
- 按层级路径分组,每组抽取最多5个唯一商品:如果某层级下商品数不足5个则全部保留,避免代码报错
- 用抽中的商品ID列表过滤原始日度销售DataFrame,得到最终结果
可直接运行的代码示例
假设你的日度销售DataFrame名为sales_df,5个层级对应的列名分别为level1/level2/level3/level4/level5,商品唯一标识列名为product_id,你可以根据自己的实际列名替换对应参数:
import pandas as pd # 生成带分隔符的完整层级路径列 sales_df["full_hierarchy"] = sales_df[["level1", "level2", "level3", "level4", "level5"]].agg("|".join, axis=1) # 提取层级与商品的唯一对应关系,去重减少计算量 product_hier_match = sales_df[["full_hierarchy", "product_id"]].drop_duplicates() # 按层级分组抽样,每组最多取5个商品,固定random_state可保证结果可复现 sampled_product_ids = product_hier_match.groupby( "full_hierarchy", group_keys=False ).apply( lambda group: group.sample(n=min(5, len(group)), random_state=42) )["product_id"].unique() # 过滤原始数据集 result_df = sales_df[sales_df["product_id"].isin(sampled_product_ids)]
可选调整点
- 如果你的层级数据本身存储为列表格式的列,不需要逐列拼接,直接对该列做
"|".join()处理即可 - 如果不需要纯随机抽样,想取每个层级下销售额Top5、销量Top5的商品,把
sample逻辑替换为排序取头部的逻辑即可 - 如果需要排除异常商品(比如上架时间不足30天、长期断货的商品),可以在抽样前先对
product_hier_match关联商品属性做过滤 - 不需要结果复现的话,可以删掉
random_state参数,每次运行会得到不同的随机抽样结果
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

