如何在Pandas DataFrame中转置指定列生成宽表
Pandas DataFrame行列转换(将Reason转为列)
原始DataFrame
| RepName | Hours | Reason |
|---|---|---|
| John | 4 | Research |
| John | 15 | Training |
| Matt | 6 | Project Labor |
| Matt | 10 | Training |
目标DataFrame
| RepName | Research | Training | Project Labor |
|---|---|---|---|
| John | 4 | 15 | 0 |
| Matt | 0 | 10 | 6 |
解决方案
你需要的是窄表转宽表的操作,转置和melt是反向操作,所以不适用。下面两种方法可以快速解决问题:
方法1:用pivot_table(新手首选,一步到位)
这个方法会自动处理缺失值,直接得到目标格式:
import pandas as pd # 构造原始数据(如果已有DataFrame可跳过此步) df = pd.DataFrame({ 'RepName': ['John', 'John', 'Matt', 'Matt'], 'Hours': [4, 15, 6, 10], 'Reason': ['Research', 'Training', 'Project Labor', 'Training'] }) # 核心转换代码 result = df.pivot_table( index='RepName', # 以RepName作为行标识 columns='Reason', # 将Reason的每个唯一值转为列 values='Hours', # 用Hours的值填充对应单元格 fill_value=0, # 无对应数据的位置填0 aggfunc='sum' # 因每个RepName+Reason仅一条数据,sum/first效果一致 ).reset_index() # 移除列索引的名称,让表格更整洁 result.columns.name = None print(result)
方法2:用pivot+fillna
如果想用基础的pivot方法,需要手动填充缺失值:
result = df.pivot(index='RepName', columns='Reason', values='Hours').fillna(0).reset_index() result.columns.name = None
内容的提问来源于stack exchange,提问作者jmike877
相关产品推荐
相关产品推荐

