将多列拆分为行 - 多索引

问题描述 投票:0回答:1

我有一个如下所示的带有多索引的数据框

mx_dict = pd.read_excel('ABC Bookings.xlsx', header=[1,2], sheet_name=None)

Excel 文件(如果有用):excel file

mx = pd.concat(mx_dict.values(), axis=0)
print(mx)

Unnamed: 0_level_0 Unnamed: 1_level_0 January                 February  \
              Client   Client Full Name  Gross     Net Billable   Gross    
0                ABC         Client ABC   500.0  400.0      800      NaN   
1                ABC         Client ABC     NaN    NaN        0    300.0   

                   
     Net Billable  
0    NaN      NaN  
1  100.0    600.0  

0 级 - 前 2 列没有名称,但其余的将是一年中的月份 - 一月 - 十二月

第 1 级 - 这将包括客户代码和名称以及一年中每个月的毛额/净额/可计费

我想“取消堆叠”月份和值并添加为额外行,如下所示

|Client | Client Full Name | Month   | Gross | Net | Billable
|ABC    | Client ABC       | January | 500   | 400 | 800
|ABC    | Client ABC       | February| 300   | 100 | 600

我已按照建议尝试了以下方法,但它不起作用,可能是因为我没有在最初的帖子中包含我的 df 的结构

我尝试了各种其他方法,包括取消堆栈和旋转,但似乎无法获得我想要的结果。有什么想法吗?

这只是一个示例,因为我无法分享完整的详细信息,但 Excel 文件最终将包含数百个不同的客户和值

(如果您需要我分享更多代码,请告诉我)

谢谢

python pandas pivot stack multi-index
1个回答
2
投票

假设这是您的数据框:

data = {
    ("January", "Gross"): {"ABC": 500},
    ("January", "Net"): {"ABC": 400},
    ("January", "Billable"): {"ABC": 800},
    ("February", "Gross"): {"ABC": 300},
    ("February", "Net"): {"ABC": 100},
    ("February", "Billable"): {"ABC": 600},
}
df = pd.DataFrame(data)
df.index = pd.MultiIndex.from_tuples(
    [("ABC", "Client ABC")], names=["Client", "Client_Full Name"]
)
                        January               February              
                          Gross  Net Billable    Gross  Net Billable
Client Client_Full Name                                             
ABC    Client ABC           500  400      800      300  100      600

您可以使用

.stack
.reset_index
:

df.stack(level=0).reset_index().rename(columns={"level_2": "Month"})
  Client Client_Full Name     Month  Gross  Net  Billable
0    ABC       Client ABC  February    300  100       600
1    ABC       Client ABC   January    500  400       800
© www.soinside.com 2019 - 2024. All rights reserved.