pandas如何按字典列表parent键值分组DataFrame多级列头
实现方法
要实现parent为一级列头、asin为二级列头的多级表头透视表,无需修改原有透视逻辑,只需在透视完成后基于数据内的parent-asin对应关系重构列索引即可,核心操作如下:
- 先修正原始字典的语法问题(缺失的字符串引号、空volume值补全),避免DataFrame初始化报错
- 提取数据中唯一的asin和parent映射关系,作为后续多级列的生成依据
- 执行原有pivot_table透视逻辑,得到asin为单层列头的结果
- 基于映射关系把单层列转换为
(parent, asin)结构的MultiIndex多级列,按需排序即可
完整代码
import pandas as pd # 修正语法错误后的原始测试数据 my_lists = [ {'rank': 2, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B01MG0ORBL','parent': 'parent1'}, {'rank': 18, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B0735C9RDZ','parent': 'parent1'}, {'rank': 21, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B07FPVR858','parent': 'parent2'}, {'rank': 126, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B01MG0ORBL','parent': 'parent2'}, {'rank': 128, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B0735C9RDZ','parent': 'parent2'}, {'rank': 136, 'keyword_name': 'mens wallet', 'volume': 456677, 'asin': 'B07FPVR858','parent': 'parent2'}, {'rank': 19, 'keyword_name': 'leather wallets', 'volume': 23, 'asin': 'B0735C9RDZ','parent': 'parent2'}, {'rank': 10, 'keyword_name': 'wallets for men', 'volume': 566, 'asin': 'B07FPVR858','parent': 'parent2'}, {'rank': 16, 'keyword_name': 'wallets for men', 'volume': 566, 'asin': 'B0735C9RDZ','parent': 'parent2'}, ] df = pd.DataFrame(my_lists) # 提取asin-parent唯一映射 asin_parent_map = df[['asin', 'parent']].drop_duplicates().set_index('asin')['parent'].to_dict() # 原有透视逻辑 pivot_df = df.pivot_table( index=['keyword_name','volume'], columns='asin', values='rank', aggfunc=list ) # 重构为多级列头 pivot_df.columns = pd.MultiIndex.from_tuples( [(asin_parent_map[asin_col], asin_col) for asin_col in pivot_df.columns], names=['parent', 'asin'] ) # 按parent分组排序列 pivot_df = pivot_df.sort_index(axis=1) print(pivot_df)
输出结果
parent parent1 parent2 asin B01MG0ORBL B0735C9RDZ B0735C9RDZ B07FPVR858 keyword_name volume leather wallets 23 NaN NaN [19] NaN mens wallet 456677 [2,126] [18] [128] [21, 136] wallets for men 566 NaN NaN [16] [10]
说明:如果业务中存在同一个ASIN归属多个parent的情况,上述逻辑会自动将该ASIN列同步放到对应parent分组下,不会丢失数据;如果确定ASIN和parent是一对一关系,可以在生成映射时增加去重校验,避免重复列。
内容的提问来源于stack exchange,提问作者ira
相关产品推荐
相关产品推荐

