将数据透视表转换为Pandas中的“整洁”数据框

时间:2020-02-05 18:52:13

标签: python pandas pivot-table tidyverse melt

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

  X Y
A 1 2
B 3 4

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

V1 V2 value
A  X    1
A  Y    2
B  X    3
B  Y    4

行和列的顺序对我来说无关紧要,因此以下内容完全可以接受:

value V1 V2
  2    A  Y
  4    B  Y
  3    B  X
  1    A  X

在我第一次尝试这样做(它能够为我提供正确的最终答案)时,我遍历了行和列。这太慢了,我怀疑熊猫的某些机器会使它运行得更快。

看来melt接近我寻求的魔力,但并不能一路吸引我。第一个数组变成这样:

   V2 value
0  X    1
1  X    2
2  Y    3
3  Y    4

它摆脱了我的V1变量!

melt没什么特别的,所以我很高兴阅读使用其他方法的答案,特别是如果melt的嵌套循环速度不比我的嵌套循环快,而另一种解决方案是。但是,如何从该数组转到要作为输出的整洁数据帧呢?

示例数据框:

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

2 个答案:

答案 0 :(得分:5)

DataFrame.reset_indexDataFrame.rename_axis ,然后与DataFrame.melt 一起使用。如果您要订购列,我们可以使用DataFrame.reindex

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

另一种方法DataFrame.stack

new_df = (df.stack()
            .rename_axis(index = ['V1','V2'])
            .rename('value')
            .reset_index()
            .reindex(columns = ['value','V1','V2']))
print(new_df)

   value V1 V2
0      1  A  X
1      3  B  X
2      2  A  Y
3      4  B  Y

为名字起名字还有另外一种选择,例如在评论中评论 @Scott Boston

答案 1 :(得分:2)

融合是一种很好的方法,但是在按索引标识结果方面似乎并不能很好地发挥作用。您可以先重置索引以将其移至其自己的列,然后将该列用作ID列。

student.Subjects = subjects'
then add student using your