【问题标题】:Pivot table to "tidy" data frame in Pandas数据透视表到 Pandas 中的“整洁”数据框
【发布时间】:2020-05-21 18:06:28
【问题描述】:

我有一个数字数组(我认为格式使其成为数据透视表),我想将其转换为“整洁”的数据框。例如,我从左侧下方的变量 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

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

似乎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"])

【问题讨论】:

  • 是的,melt 不能很好地配合数据帧索引,我几乎总是在使用之前 reset_index。

标签: python pandas pivot-table melt


【解决方案1】:

使用DataFrame.reset_index 和DataFrame.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

要命名,还有另一种选择,例如在 cmets 中评论 @Scott Boston

【讨论】:

  • 如果你的 pandas 版本低于 0.24.0 那么你只需要更新到new_df = (df.rename_axis('V1').reset_index().melt('V1',var_name='V2').reindex(columns = ['value','V1','V2']))
  • 这里有一个简短的语法方式df.rename_axis(index='V1', columns='V2').reset_index().melt('V1')
  • 而且,同样使用堆栈,df.rename_axis(index='V1', columns='V2').stack().rename('value').reset_index()
【解决方案2】:

Melt 是一个很好的方法,但它似乎不能很好地通过索引识别结果。您可以先重置索引以将其移动到自己的列,然后将该列用作 id col。

test = pd.DataFrame([[1,2],[3,4]], columns=['X', 'Y'], index=['A', 'B'])
   X  Y
A  1  2
B  3  4

test = test.reset_index()
  index  X  Y
0     A  1  2
1     B  3  4

test.melt('index',['X', 'Y'], 'prev cols')  
  index prev cols  value
0     A         X      1
1     B         X      3
2     A         Y      2
3     B         Y      4

【讨论】:

    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 2016-01-15
    • 2021-12-12
    • 2018-10-28
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多