如何将含动态列的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
相关产品推荐
相关产品推荐

