使用python展开/取消堆栈excel pivot

使用python展开/取消堆栈excel pivot,python,excel,pandas,pivot-table,Python,Excel,Pandas,Pivot Table,我有一个excel pivot,其中包含以下数据: 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,

我有一个excel pivot,其中包含以下数据:

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获得所需的输出?

使用:

另一种解决方案具有,但列中的值顺序不同:

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
使用:

另一种解决方案具有,但列中的值顺序不同:

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

非常感谢。已经挣扎了很长一段时间了。这两种解决方案都非常有效。再次感谢。不客气!如果可能的话,你也可以投票。谢谢,非常感谢。已经挣扎了很长一段时间了。这两种解决方案都非常有效。再次感谢。不客气!如果可能的话,你也可以投票。谢谢