如何用Python Pandas实现表格转换:表头转内容、值转表头
Pandas表格转换:将任务转为列、人名转为内容的实现
原表格结构
先看你创建的原表格:
import pandas as pd data = [['4/04/2023','Floors','Tables','Roof','Paint',''],['4/05/2023','','Floors','Tables','Roof','Paint'],['4/06/2023','Paint','','Floors','Tables','Roof'],['4/07/2023','Roof','Paint','','Floors','Tables']] df = pd.DataFrame(data, columns=['Date', 'Jim','Bob','Ed','James','Joe'])
原表格以Date为日期列,人名(Jim、Bob等)为列头,单元格值为对应的任务(Floors、Tables等),空字符串表示无任务。
转换步骤
你推测的melt+pivot思路是对的,只需调整参数并处理空值,具体步骤如下:
- 用
melt将宽表转成长表
把人名列转为数据行的Person字段,任务值转为Task字段,同时过滤掉空任务的行:
# 转长表并过滤空值 melted_df = df.melt( id_vars='Date', # 保留作为标识的Date列 var_name='Person', # 原列名(人名)存为Person字段 value_name='Task' # 原单元格值(任务)存为Task字段 ).query("Task != ''") # 剔除空任务的行
- 用
pivot将长表转回宽表
以Date为行标识,Task为新的列头,Person为对应单元格的值:
# 转宽表并重置索引 result_df = melted_df.pivot( index='Date', # 行索引用Date columns='Task', # 新列头用Task values='Person' # 单元格填充对应的人名 ).reset_index() # 将Date从索引转回普通列
最终结果
执行后result_df即为目标样式:
- 列头变为任务名(Floors、Tables、Roof、Paint)
- 每行对应一个日期,单元格内容是该任务的负责人
打印result_df会得到:
Task Date Floors Tables Roof Paint 0 4/04/2023 Jim Bob Ed James 1 4/05/2023 Bob Ed James Joe 2 4/06/2023 Ed James Joe Jim 3 4/07/2023 James Joe Jim Bob
内容的提问来源于stack exchange,提问作者James C
相关产品推荐
相关产品推荐

