如何使用Pandas将class_cd行转列为新列,按Id聚合数据?
Pandas实现行转列:将class_cd转为列名
原始数据
示例数据如下:
Id name class_cd class_name 0 1 A abc1 dog 1 1 A def2 canine 2 1 A ghi1 safe 3 2 B abc1 cat 4 2 B def2 tabby
可通过以下代码复现:
import pandas as pd df = pd.DataFrame({ 'Id': [1, 1, 1, 2, 2], 'name':['A', 'A', 'A', 'B', 'B'], 'class_cd': ['abc1', 'def2', 'ghi1', 'abc1', 'def2'], 'class_name': ['dog', 'canine', 'safe', 'cat', 'tabby'] })
需求
将class_cd的唯一值作为新列名,列值为对应的class_name,最终每个Id(结合name)对应一行数据,期望输出:
Id name abc1 def2 ghi1 0 1 A dog canine safe 1 2 B cat tabby
解决方案
使用Pandas的pivot方法可以直接实现这个需求,指定分组的索引列、要转为列的字段以及填充值的字段即可:
result = df.pivot(index=['Id', 'name'], columns='class_cd', values='class_name').reset_index() # 移除列索引的名称,避免输出冗余 result.columns.name = None print(result)
运行后输出:
Id name abc1 def2 ghi1 0 1 A dog canine safe 1 2 B cat tabby NaN
如果希望空值显示为空白而非NaN,可以添加fillna('')处理:
result = df.pivot(index=['Id', 'name'], columns='class_cd', values='class_name').reset_index().fillna('') result.columns.name = None print(result)
输出与期望完全一致:
Id name abc1 def2 ghi1 0 1 A dog canine safe 1 2 B cat tabby
说明
index参数指定保持为行标识的列(Id和name组合后唯一确定每行);columns参数指定要转换为列名的字段(即class_cd);values参数指定填充到新列中的值(即class_name);reset_index()用于将多级索引转为普通列;columns.name = None用于移除列索引的冗余名称。
内容的提问来源于stack exchange,提问作者ChrisOram
相关产品推荐
相关产品推荐

