如何用pandas合并多个DataFrame构建多级列索引3D结构数据表
可行实现方案
核心基于pandas的MultiIndex多级列特性实现三维结构存储,拼接时自动对齐行索引,天然支持后续扩展档位、新增品类,具体步骤如下:
步骤1:建立子表与顶层品类的映射
先把现有的4个独立DataFrame和对应的顶层分类名做绑定,分类名可以根据实际业务调整:
import pandas as pd # 键为顶层品类名,值为对应存储该品类数据的DataFrame,可按需修改映射关系 category_df_mapping = { "Gaming": dfG, "Casual": dfC, "Business": dfB, "Office": dfO }
步骤2:转换多级列头并横向拼接
给每个子表的列加上一级品类标识,再沿列方向拼接,自动对齐行索引:
processed_df_list = [] for category, sub_df in category_df_mapping.items(): # 为子表生成(品类名 -> 原字段名)的二级列索引 sub_df.columns = pd.MultiIndex.from_product( [[category], sub_df.columns], names=["product_category", "field"] ) processed_df_list.append(sub_df) # 横向拼接得到最终结构 final_df = pd.concat(processed_df_list, axis=1)
步骤3:扩展行档位/新增数据的方法
拼接完成后,可以直接按索引赋值扩展light、high_end等新档位,不需要重构表结构:
# 示例:新增light档位下Gaming品类的品牌和价格 final_df.loc["light", ("Gaming", "brand")] = "Lenovo" final_df.loc["light", ("Gaming", "price")] = {"gte": 1499, "lte": 2199} # 示例:新增Casual品类light档位数据 final_df.loc["light", ("Casual", "brand")] = "Acer" final_df.loc["light", ("Casual", "price")] = {"gte": 399, "lte": 799}
效果说明
执行完上述代码后,打印final_df即可得到预期结构:
- 顶层列是Gaming、Casual等自定义品类
- 二级列固定为
brand、price两个字段 - 行索引自动对齐
cheap、light等档位,未赋值的位置默认填充NaN,后续补值即可 - 原
price字段存储的区间字典不会被pandas修改,存取逻辑和普通字段完全一致
扩展提示
- 新增品类时,只要新建列名为
['brand', 'price']的子DataFrame,加入映射字典重新执行拼接即可 - 需要对行档位排序时,直接调用
final_df = final_df.sort_index()即可 - 需要筛选单个品类的数据时,直接用
final_df['Gaming']即可取出该品类下所有档位的品牌、价格数据,结构和原来的单表完全一致
内容的提问来源于stack exchange,提问作者mohamad jumaa
相关产品推荐
相关产品推荐

