Pandas 中的数据透视表以“整理”数据框

Dav*_*ave 2 python pivot-table melt pandas

我有一组数字(我认为该格式使其成为数据透视表),我想将其转换为“整洁”的数据框。例如,我从左侧的变量 1、顶部的变量 2 和中间的感兴趣值开始,如下所示:

  X Y
A 1 2
B 3 4
Run Code Online (Sandbox Code Playgroud)

我想把它变成这样一个整洁的数据框:

V1 V2 value
A  X    1
A  Y    2
B  X    3
B  Y    4
Run Code Online (Sandbox Code Playgroud)

行和列顺序对我来说无关紧要,所以以下是完全可以接受的:

value V1 V2
  2    A  Y
  4    B  Y
  3    B  X
  1    A  X
Run Code Online (Sandbox Code Playgroud)

对于我的第一次尝试,它能够让我得到正确的最终答案,我遍历了行和列。这非常慢,我怀疑 Pandas 中的某些机器会使它运行得更快。

这似乎melt与我寻求的魔法很接近,但它并没有让我一路走到那里。第一个数组变成了这个:

   V2 value
0  X    1
1  X    2
2  Y    3
3  Y    4
Run Code Online (Sandbox Code Playgroud)

它摆脱了我的 V1 变量!

没有什么特别之处melt,所以我很乐意阅读使用其他方法的答案,特别是如果melt它并不比我的嵌套循环快多少,而另一个解决方案是。尽管如此,我怎样才能从那个数组转到我想要作为输出的那种整洁的数据框?

示例数据框:

df = pd.DataFrame({"X":[1,3], "Y":[2,4]},index=["A","B"])
Run Code Online (Sandbox Code Playgroud)

ans*_*sev 5

DataFrame.reset_index然后一起使用。如果您想要订购列,我们可以使用.DataFrame.rename_axis DataFrame.meltDataFrame.reindex

new_df = (df.rename_axis(index = 'V1')
            .reset_index()
            .melt('V1',var_name='V2')
            .reindex(columns = ['value','V1','V2']))
print(new_df)
Run Code Online (Sandbox Code Playgroud)

另一种方法DataFrame.stack

new_df = (df.stack()
            .rename_axis(index = ['V1','V2'])
            .rename('value')
            .reset_index()
            .reindex(columns = ['value','V1','V2']))
print(new_df)
Run Code Online (Sandbox Code Playgroud)
   value V1 V2
0      1  A  X
1      3  B  X
2      2  A  Y
3      4  B  Y
Run Code Online (Sandbox Code Playgroud)

到名称的名称有喜欢评论另一种选择@Scott波士顿的评论

  • 这是一个简短的语法方式 `df.rename_axis(index='V1', columns='V2').reset_index().melt('V1')` (2认同)