将 MultiIndex 数据框重塑为表格格式

Posted

技术标签:

【中文标题】将 MultiIndex 数据框重塑为表格格式【英文标题】:Reshape MultiIndex dataframe to tabular format 【发布时间】:2018-04-04 17:15:24 【问题描述】:

给定一个示例 MultiIndex:

idx = pd.MultiIndex.from_product([[0, 1, 2], ['a', 'b', 'c', 'd']])    
df = pd.DataFrame('value' : np.arange(12), index=idx)

df

     value
0 a      0
  b      1
  c      2
  d      3
1 a      4
  b      5
  c      6
  d      7
2 a      8
  b      9
  c     10
  d     11

我怎样才能有效地将其转换为像这样的表格格式?

   a  b   c   d
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

此外,鉴于上面的数据框,我怎样才能将其恢复到原来的多索引状态?


我尝试过的:

pd.DataFrame(df.values.reshape(-1, df.index.levels[1].size), 
             index=df.index.levels[0], columns=df.index.levels[1])

这适用于第一个问题,但我不确定如何从那里恢复原状。

【问题讨论】:

df['value'].unstack()? @Zero 太明显了... unstack/stack。你可以创建一个答案......我可以标记它。 【参考方案1】:

使用unstackstack

In [5359]: dff = df['value'].unstack()

In [5360]: dff
Out[5360]:
   a  b   c   d
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

In [5361]: dff.stack().to_frame('name')
Out[5361]:
     name
0 a     0
  b     1
  c     2
  d     3
1 a     4
  b     5
  c     6
  d     7
2 a     8
  b     9
  c    10
  d    11

【讨论】:

问这个问题让我看到了stack和unstack的真正目的。【参考方案2】:

通过使用get_level_values

pd.crosstab(df.index.get_level_values(0),df.index.get_level_values(1),values=df.value,aggfunc=np.sum)
Out[477]: 
col_0  a  b   c   d
row_0              
0      0  1   2   3
1      4  5   6   7
2      8  9  10  11

【讨论】:

但是crosstab是我最喜欢的,所以我还是喜欢这个答案。 @cᴏʟᴅsᴘᴇᴇᴅ 你知道..我想到的第一个方法是unstack(-1) :-)【参考方案3】:

在使用 stack/unstack 时您应该考虑的另一种选择(尽管在这种情况下 unstack 显然更好!)是pivot_table

In [11]: df.pivot_table(values="value", index=df.index.get_level_values(0), columns=df.index.get_level_values(1))
Out[11]:
   a  b   c   d
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

【讨论】:

只是好奇,get_level_valueslevels[i] 有什么好处? @cᴏʟᴅsᴘᴇᴇᴅ 我不这么认为,唯一的问题是有时通过名称引用级别更好,get_level_values 允许(所以习惯于编写它)。

以上是关于将 MultiIndex 数据框重塑为表格格式的主要内容,如果未能解决你的问题,请参考以下文章

将多个值列重塑为宽格式

将三列数据框重塑为矩阵(“长”到“宽”格式)[重复]

将时间序列数据从宽格式重塑为高格式(用于绘图)[重复]

R 中的重塑问题:我重塑的数据框将 3 个变量变为 1 个

从 Pandas 中的 MultiIndex 创建数据框

将 dict 构造函数转换为 Pandas MultiIndex 数据帧