如何基于ID的高频时段及最高繁忙度生成统一分类列?
解决方案:按店铺ID统一分类冰淇淋店业务时段
步骤1:生成符合规则的临时分类列
替换原有pd.cut逻辑,精准生成贴合需求的临时分类(非核心时段统一标记为None):
import pandas as pd import numpy as np # 用条件判断生成临时分类列 conditions = [ (data["Time"] >=7) & (data["Time"] <=10), (data["Time"] >=11) & (data["Time"] <=14), (data["Time"] >=17) & (data["Time"] <=21) ] choices = ["Morning", "Afternoon", "Night"] data["temp_class"] = np.select(conditions, choices, default="None")
步骤2:按ID分组确定最终分类
按店铺ID分组,统计各分类的出现次数、对应最高繁忙度,通过排序优先级解决平局问题:
# 分组统计每个ID下各分类的出现次数、最大Busy值 grouped = data.groupby(["ID", "temp_class"]).agg( count=("temp_class", "size"), max_busy=("Busy", "max") ).reset_index() # 按ID分组后,先按分类次数降序,再按最高Busy值降序,取第一行作为该ID的最终分类 final_class = grouped.sort_values(by=["ID", "count", "max_busy"], ascending=[True, False, False]) \ .groupby("ID").first() \ .reset_index()[["ID", "temp_class"]] \ .rename(columns={"temp_class": "Classification"})
步骤3:将分类映射回原数据集
把每个ID的统一分类批量赋值给该ID的所有记录:
# 合并原数据与最终分类结果 data = data.merge(final_class, on="ID", how="left") # 可选:清理临时列 data.drop("temp_class", axis=1, inplace=True)
逻辑说明
- 临时分类生成:用
np.select避免pd.cut的区间边界歧义,精准匹配规则 - 平局处理:优先按分类出现次数排序,次数相同时取对应分类下Busy值最高的选项
- 批量映射:通过
merge实现单个ID的分类结果同步到所有关联记录
内容的提问来源于stack exchange,提问作者Student
相关产品推荐
相关产品推荐

