使用Pandas透视表重塑数据:实现Amount与Quantity分行展示
Pandas透视后实现Amount与Quantity分行展示
问题场景
现有如下DataFrame,希望通过透视操作将Amount和Quantity在同一Category、Code、Invoice、Unit Price组合下分行展示,而非横向并排:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Year':[2022,2022,2023,2023,2024,2024], 'Month':[1,12,11,12,1,1], 'Code':[None,'John Johnson',np.nan,'John Smith','Mary Williams','ted bundy'], 'Unit Price':[np.nan,200,None,56,75,65], 'Quantity':[1500, 140000, 1400000, 455, 648, 759], 'Amount':[100, 10000, 100000, 5, 48, 59], 'Invoice':['soccer','basketball','baseball','football','baseball','ice hockey'], 'energy':[100.,100,100,54,98,3], 'Category':['alpha','bravo','kappa','alpha','bravo','bravo'] })
原使用pivot_table的代码得到的结果中,Amount和Quantity是横向并列的,不符合需求:
index_to_use = ['Category','Code','Invoice','Unit Price'] values_to_use = ['Amount','Quantity'] columns_to_use = ['Year','Month'] df2 = df.pivot_table(index=index_to_use, values=values_to_use, columns=columns_to_use)
解决方案
通过stack()操作将列层级中的Amount/Quantity转移到索引中,实现分行展示:
# 执行原透视操作 df2 = df.pivot_table(index=index_to_use, values=values_to_use, columns=columns_to_use) # 将列的第一层(Amount/Quantity)转到索引,实现分行 df_result = df2.stack(level=0).rename_axis(index=index_to_use + ['Type'])
此时输出的结果中,同一Category、Code、Invoice、Unit Price组合下,Amount和Quantity会分别占据一行,符合需求。例如对应示例数据中2022年12月的记录,会显示为:
Category Code Invoice Unit Price Type 2022 12 bravo John Johnson basketball 200.0 Amount 10000 bravo John Johnson basketball 200.0 Quantity 140000
说明
stack(level=0):将列MultiIndex的第一层(即Amount和Quantity)移动到行索引中,从而实现同一索引组合下的分行展示rename_axis:用于重命名索引层级,让输出结构更清晰- 如果需要调整列的显示格式,可以进一步使用
unstack或reset_index来调整最终展示结构
内容的提问来源于stack exchange,提问作者Alhpa Delta
相关产品推荐
相关产品推荐

