将 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】:
使用unstack
和stack
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_values
比 levels[i]
有什么好处?
@cᴏʟᴅsᴘᴇᴇᴅ 我不这么认为,唯一的问题是有时通过名称引用级别更好,get_level_values 允许(所以习惯于编写它)。以上是关于将 MultiIndex 数据框重塑为表格格式的主要内容,如果未能解决你的问题,请参考以下文章