如何从产品数据中提取Top5产品并按分类聚合展示?
解决方案:按分类聚合并提取Top5产品
步骤1:数据预处理
先清洗产品列的脏数据,处理带空格的数值、空值,同时统一子分类的大小写:
import pandas as pd # 假设原始数据已加载到df中 # 统一子分类为小写 df['子分类(subcategory)'] = df['子分类(subcategory)'].str.lower() # 筛选所有产品列 product_cols = [col for col in df.columns if col.startswith('product')] # 处理产品列的数值:空值转0,"1 1"格式转求和值 for col in product_cols: df[col] = df[col].fillna(0) df[col] = df[col].apply(lambda x: sum(map(int, str(x).split())) if isinstance(x, str) and x.strip() else int(x))
步骤2:计算分组基础统计量
按分类、子分类聚合,计算crn计数和各产品的求和值:
# 构建聚合字典 agg_dict = {'crn': 'count'} for col in product_cols: agg_dict[col] = 'sum' # 分组聚合并重置索引 grouped_stats = df.groupby(['分类(Category)', '子分类(subcategory)']).agg(agg_dict).reset_index() # 重命名列名匹配需求 grouped_stats = grouped_stats.rename(columns={ 'crn': 'crn计数(crncount)', **{col: f'{col}求和(sumof{col})' for col in product_cols} })
步骤3:提取每个分组的Top5产品
对每个分组,按产品求和值降序排序,取前5个产品名称:
def get_top_products(group, top_n=5): # 计算当前组各产品的求和值 product_sums = group[product_cols].sum() # 降序排序后取前top_n个产品名称 top_products = product_sums.sort_values(ascending=False).head(top_n).index.tolist() # 不足5个时补空值 while len(top_products) < top_n: top_products.append('') # 生成对应列名并返回 return pd.Series( top_products, index=[f'Top产品{i+1}(topproduct{i+1})' for i in range(top_n)] ) # 应用到每个分组 top_products_per_group = df.groupby( ['分类(Category)', '子分类(subcategory)'] ).apply(get_top_products).reset_index()
步骤4:合并并整理最终结果
将基础统计量和Top5产品合并,调整列顺序匹配期望格式:
# 合并两个结果表 final_df = pd.merge( grouped_stats, top_products_per_group, on=['分类(Category)', '子分类(subcategory)'] ) # 调整列顺序 desired_columns = [ '分类(Category)', '子分类(subcategory)', 'crn计数(crncount)', 'Top产品1(topproduct1)', 'Top产品2(topproduct2)', 'Top产品3(topproduct3)', 'Top产品4(topproduct4)', 'Top产品5(topproduct5)' ] + [f'{col}求和(sumof{col})' for col in product_cols] final_df = final_df[desired_columns] # 输出为HTML格式(匹配需求的表格结构) print(final_df.to_html( classes='s-table', container_class='s-table-container', index=False, na_rep='' ))
内容的提问来源于stack exchange,提问作者Alok
相关产品推荐
相关产品推荐

