【问题标题】:flatten/un-stack excel pivot using python pandas使用 python pandas 展平/取消堆栈 excel 枢轴
【发布时间】:2018-05-09 01:42:36
【问题描述】:

我有一个 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 列开始追加所有列。我能够遍历第 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 获得所需的输出?

【问题讨论】:

    标签: python excel pandas pivot-table


    【解决方案1】:

    使用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 的另一种解决方案,但列中值的顺序不同:

    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
    

    【讨论】:

    • 非常感谢。现在已经苦苦挣扎了一段时间。这两种解决方案都非常有效。再次感谢。
    • 不客气!如果可能的话,你也可以投票。谢谢。
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 2019-01-08
    • 2021-05-06
    • 2017-08-13
    • 1970-01-01
    • 2016-09-06
    • 2021-09-10
    • 2015-05-30
    相关资源
    最近更新 更多