Excel 文件中的 pandas 数据帧中的双 "melt"

Double "melt" in a pandas dataframe from Excel file

我正在阅读 pandas 中的一个 excel 文件,其中包含两个级别的列。我正在使用 Python 3.7

Example Excel file

    Unnamed: 0  Unnamed: 1  Unnamed: 2  2021-01-01 2021-01-02   2021-01-03  2021-01-04  2021-01-05 
0   ProjectNr   Name        Sector      categorya   categoryb   categoryc   categoryd   categorye
1   1           aaa          A1         14.995      14.995      14.995       14.995     14.995
2   2           aaa          A2         7.4975      7.4975      7.4975       NaN        NaN
3   3           aaa          A3         NaN         11.996      11.996      11.996      NaN

我想将行“类别”和“日期”转换为数据框的不同列。我尝试使用 melt 但我不知道如何进行第二次熔化或熔化到组合行 headers.

我想得到类似的东西

ProjectNr   Name    Sector  Category    date         Price
1           aaa     A1      categorya   01/01/2021   € 15,00 
1           aaa     A1      categoryb   02/01/2021   € 15,00 
1           aaa     A1      categoryc   03/01/2021   € 15,00 
1           aaa     A1      categoryd   04/01/2021   € 15,00 
1           aaa     A1      categorye   05/01/2021   € 15,00 
2           aaa     A2      categorya   01/01/2021   € 7,50 
2           aaa     A2      categoryb   02/01/2021   € 7,50 
2           aaa     A2      categoryc   03/01/2021   € 7,50 
2           aaa     A2      categoryd   04/01/2021  
2           aaa     A2      categorye   05/01/2021  
3           aaa     A3      categorya   01/01/2021  
3           aaa     A3      categoryb   02/01/2021   € 12,00 
3           aaa     A3      categoryc   03/01/2021   € 12,00 
3           aaa     A3      categoryd   04/01/2021   € 12,00 
3           aaa     A3      categorye   05/01/2021  

如果我使用 header=[0, 1] 创建 df,则 melt broke 包含列的名称。 如果没有 header,熔化仅适用于一列。 示例:

    Unnamed: 0  Unnamed: 1  Unnamed: 2  dt          value
0   ProjectNr   Name        Sector      2021-01-01  categorya
1   1           aaa         A1          2021-01-01  14.995
2   2           aaa         A2          2021-01-01  7.4975
3   3           aaa         A3          2021-01-01  NaN
4   ProjectNr   Name        Sector      2021-01-02  categoryb
5   1           aaa         A1          2021-01-02  14.995
6   2           aaa         A2          2021-01-02  7.4975

如何为 header 的两个级别进行熔化?

首先,我们需要正确读取excel文件

df = pd.read_excel('~/test.xlsx', header=[0, 1], index_col=[0, 1, 2])

使用您需要保持 NaNMultiIndex 级别堆叠,然后重置索引

df = df.stack(level=[1, 0], dropna=False).reset_index()

最后,重命名列

df.columns = ['ProjectNr', 'Name', 'Sector', 'Category', 'date', 'Price']