You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:45:49