我有一个如下所示的带有多索引的数据框
mx_dict = pd.read_excel('ABC Bookings.xlsx', header=[1,2], sheet_name=None)
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 文件最终将包含数百个不同的客户和值
(如果您需要我分享更多代码,请告诉我)
谢谢
假设这是您的数据框:
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