如何将DataFrame列数据转换为行式宽表?
实现DataFrame的行式结构转换
原始数据
你的原始数据字典如下:
data_dict = { 'CustCode': {0: 64, 1: 64, 2: 97, 3: 97, 4: 97, 5: 97, 6: 97, 7: 97, 8: 97, 9: 110}, 'InvoiceMonth': {0: 'Aug', 1: 'Sep', 2: 'Apr', 3: 'Aug', 4: 'Feb', 5: 'Jan', 6: 'Jul', 7: 'Mar', 8: 'May', 9: 'Feb'}, 'TotalAmount': {0: 357300, 1: 419800, 2: 515000, 3: 740700, 4: 301200, 5: 197200, 6: 112400, 7: 534900, 8: 220500, 9: 422500} }
对应的原始DataFrame为长格式(每行对应一个客户的单月记录),需要转换为宽格式:以CustCode为行索引,各月份为列,单元格值为对应月份的TotalAmount,无记录的月份显示空白或0。
实现方法
使用Pandas的pivot方法(若存在重复分组可改用pivot_table)即可完成转换,同时可按自然月份顺序整理列:
完整代码
import pandas as pd # 1. 创建原始DataFrame df = pd.DataFrame(data_dict) # 2. 定义月份的自然顺序(匹配目标结构的列顺序) month_order = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] # 3. 执行 pivot 转换并按月份顺序排列列 result_df = df.pivot( index='CustCode', columns='InvoiceMonth', values='TotalAmount' ).reindex(columns=month_order) # 4. 空值填充为整数0(可选,若需保留空白可移除该步骤) result_df = result_df.fillna(0).astype(int) # 查看最终结果 print(result_df)
代码说明
pivot:直接将长格式数据转为宽格式,指定行索引、列名、值字段即可完成核心转换。reindex(columns=month_order):确保列按1-12月的自然顺序排列,避免原始数据的随机顺序。fillna(0).astype(int):将无记录的月份值填充为0并转为整数类型,匹配原始数据的数值格式,若需保留空白(NaN)可删除此步骤。
执行后得到的结果即为你需要的行式DataFrame结构。
内容的提问来源于stack exchange,提问作者wekular
相关产品推荐
相关产品推荐

