使用pythonpandas展开/取消堆叠excel透视

我有一个像数据一样的数据透视表:

Code Region Detail Oct'17 Sep'17 Aug'17 AXISCGF zone 1 IND3D01024 -82,000 0 900,000 AXISDEF zone 5 INP467B029 85,000 182,000 0 AXISEAF zone 4 INZ514ELY4 -13,500 0 5,00,000 AXISEQF zone 2 INQ916D14E 0 -500,000 25,400 

我想要的输出是:

  Code Region Detail Month Change AXISCGF zone 1 IND3D01024 Oct'17 -82,000 AXISDEF zone 5 INP467B029 Oct'17 85,000 .. AXISCGF zone 1 IND3D01024 Sep'17 0 AXISDEF zone 5 INP467B029 Sep'17 182,000 

我想要前三列,然后追加从第四列开始的所有列。 我能够通过列4循环结束。 我的代码:

 import pandas df = pandas.read_excel('Data_2017.xlsx', sheet_name='Sales') for data_column in df.columns[3:10]: df_new = df.filter(['Code','Region','Detail',data_column]) #print df_new.head() df_new.to_csv('_TEST_Output.csv',mode='a') 

输出 :

  Code Region Detail Oct'17 0 AXISCGF zone 1 IND3D01024 -82,000 1 AXISDEF zone 5 INP467B029 85,000 .. 3501 AXISESF zone 3 INO0201062 0 Code Region Detail Sep'17 0 AXISDEF zone 5 INP467B029 182,000 

我怎样才能得到pandas期望的输出?

使用melt

 df = df.melt(['Code','Region','Detail'], value_name='Change', var_name='Month') print (df) Code Region Detail Month Change 0 AXISCGF zone 1 IND3D01024 Oct'17 -82,000 1 AXISDEF zone 5 INP467B029 Oct'17 85,000 2 AXISEAF zone 4 INZ514ELY4 Oct'17 -13,500 3 AXISEQF zone 2 INQ916D14E Oct'17 0 4 AXISCGF zone 1 IND3D01024 Sep'17 0 5 AXISDEF zone 5 INP467B029 Sep'17 182,000 6 AXISEAF zone 4 INZ514ELY4 Sep'17 0 7 AXISEQF zone 2 INQ916D14E Sep'17 -500,000 8 AXISCGF zone 1 IND3D01024 Aug'17 900,000 9 AXISDEF zone 5 INP467B029 Aug'17 0 10 AXISEAF zone 4 INZ514ELY4 Aug'17 5,00,000 11 AXISEQF zone 2 INQ916D14E Aug'17 25,400 

stack另一个解决scheme,但在列中有不同的值sorting:

 df = (df.set_index(['Code','Region','Detail']) .stack() .reset_index(name='Change') .rename(columns={'level_3':'Month'})) print (df) Code Region Detail Month Change 0 AXISCGF zone 1 IND3D01024 Oct'17 -82,000 1 AXISCGF zone 1 IND3D01024 Sep'17 0 2 AXISCGF zone 1 IND3D01024 Aug'17 900,000 3 AXISDEF zone 5 INP467B029 Oct'17 85,000 4 AXISDEF zone 5 INP467B029 Sep'17 182,000 5 AXISDEF zone 5 INP467B029 Aug'17 0 6 AXISEAF zone 4 INZ514ELY4 Oct'17 -13,500 7 AXISEAF zone 4 INZ514ELY4 Sep'17 0 8 AXISEAF zone 4 INZ514ELY4 Aug'17 5,00,000 9 AXISEQF zone 2 INQ916D14E Oct'17 0 10 AXISEQF zone 2 INQ916D14E Sep'17 -500,000 11 AXISEQF zone 2 INQ916D14E Aug'17 25,400