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

如何将含动态列的Pandas DataFrame转置为指定宽表格式?

Pandas 长表转指定宽表的实现方案

需求概述

给定如下长格式DataFrame:

import pandas as pd
data = {
    'ID':  [500, 500, 500, 500, 500, 400, 400, 400, 400, 300, 200],
    'item': ['A', 'B', 'C', 'D', 'E', 'A', 'B', 'C',  'E',   'D',    'E'],
    'Quantity': [1, 2, 3, 4, 5, 1, 2, 2, 1, 1, 5]
}
df = pd.DataFrame(data)

需要将其转换为宽表:以ID为唯一行,item作为动态列,对应位置填充Quantity值,无对应项补0。

可行实现方案

方案1:使用pivot_table(推荐)

pivot_table是最稳妥的方式,自带缺失值填充,且能处理可能存在的重复ID-item组合(通过聚合函数合并数量):

# 转换宽表,缺失值补0
wide_df = df.pivot_table(index='ID', columns='item', values='Quantity', fill_value=0)
# 可选:将ID从索引转为普通列
wide_df = wide_df.reset_index()
print(wide_df)

输出结果:

item   ID  A  B  C  D  E
0     200  0  0  0  0  5
1     300  0  0  0  1  0
2     400  1  2  2  0  1
3     500  1  2  3  4  5

方案2:使用pivot + fillna

如果能确保每个ID-item组合唯一,可直接用pivot,之后手动填充缺失值为0:

wide_df = df.pivot(index='ID', columns='item', values='Quantity').fillna(0).astype(int)
wide_df = wide_df.reset_index()
print(wide_df)

注:astype(int)用于确保数量为整数类型,根据需求可选。

方案3:使用pd.crosstab

通过交叉表函数也能实现,指定values和聚合函数即可:

wide_df = pd.crosstab(
    index=df['ID'],
    columns=df['item'],
    values=df['Quantity'],
    aggfunc='sum'
).fillna(0).astype(int).reset_index()
print(wide_df)

关键提示

  • 若数据中存在重复的ID-item记录,pivot_table和crosstab会通过sum聚合数量,而pivot会报错,因此优先推荐pivot_table;
  • reset_index()操作可根据需求选择,若需要ID作为普通列则执行,否则保留为索引即可。

内容的提问来源于stack exchange,提问作者Romeo Gherasim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 21:20:07