Pandas如何将行MultiIndex的DataFrame转换为MultiColumn结构
实现方案
直接用unstack指定要转换的行索引层级即可,核心代码仅需1行,不需要组合多个复杂变形方法。
核心代码
import pandas as pd import numpy as np # --- 原有数据构造逻辑 --- multiindex1 = pd.MultiIndex.from_product([['a'], np.arange(3, 8)]) df1 = pd.DataFrame(np.random.randn(5, 3), index=multiindex1) multiindex2 = pd.MultiIndex.from_product([['s'], np.arange(1, 6)]) df2 = pd.DataFrame(np.random.randn(5, 3), index=multiindex2) multiindex3 = pd.MultiIndex.from_product([['d'], np.arange(2, 7)]) df3 = pd.DataFrame(np.random.randn(5, 3), index=multiindex3) df = pd.concat([df1, df2, df3]) # --- 转换逻辑 --- result = df.unstack(level=0).swaplevel(axis=1).sort_index(axis=1)
实现说明
- 之前用
unstack没得到正确结果,是因为该方法默认拆解行索引的最内层(level=-1,也就是数据里的数值索引层),只要显式指定level=0,就会把行索引第0层的分类标签(a/s/d)转到列维度。 unstack会自动对齐行索引第1层的所有取值,把所有出现过的数值(1到7)作为新的单一行索引,没有对应数据的位置自动填充NaN,不需要额外做重索引或者缺失值填充。swaplevel(axis=1)用来交换列两层索引的顺序,把分类标签a/s/d放到列MultiIndex的第0层,原有列名0/1/2放到第1层,和目标结构完全一致;sort_index(axis=1)用来按列标签排序,保证同个分类下的列连续展示。
输出效果
转换后的数据结构和目标格式完全匹配:
a s d 0 1 2 0 1 2 0 1 2 1 NaN NaN NaN -0.972483 0.202820 0.265304 NaN NaN NaN 2 NaN NaN NaN 0.007303 0.802974 -0.254106 1.440793 -0.697371 0.902004 3 0.872208 -0.145098 -0.519966 1.619309 -1.545089 0.161493 0.390181 -0.449725 -0.462104 4 -0.976089 -0.730808 -1.463151 2.847376 0.951796 -0.877882 0.056916 0.140066 0.918281 5 -0.026869 0.227912 1.525924 1.749237 -0.327026 0.467784 0.164234 -2.491176 2.035113 6 -0.161126 -0.415913 -1.211737 NaN NaN NaN -1.648948 0.372179 0.600297 7 -0.893881 -0.769385 0.346436 NaN NaN NaN NaN NaN NaN
注:示例里列名写的b/c为笔误,实际对应原数据里的s/d分类。
内容的提问来源于stack exchange,提问作者f1msch
相关产品推荐
相关产品推荐

