如何在pandas中为转置数据创建新列 按Visit ID合并多行数据
解决方案
完整实现代码
import pandas as pd # 读取原始数据 df = pd.read_excel(r'C:\Users\TEST.xlsx', sheet_name = 'Sheet1') # 给同一个Visit ID下的每行生成顺序编号,用于区分多条诊断记录 df['dx_seq'] = df.groupby('Visit ID').cumcount() + 1 # 透视得到诊断编码的多列结构 dx_df = df.pivot(index='Visit ID', columns='dx_seq', values='DX Code').add_prefix('DX Code') dx_df = dx_df.rename(columns={'DX Code1': 'DX Code'}).reset_index() # 透视得到医保类型的两列结构 ins_df = df.pivot(index='Visit ID', columns='Primary or Secondary', values='Insurance').reset_index() # 合并两部分结果得到最终输出表 result = pd.merge(dx_df, ins_df, on='Visit ID') print(result)
实现逻辑说明
- 先用
groupby('Visit ID').cumcount()给同一个就诊ID下的多条记录生成1、2的顺序编号,作为后续展开多列的依据 - 以Visit ID为索引、顺序编号为列名透视诊断编码字段,生成
DX Code、DX Code2两列 - 再以Visit ID为索引、「Primary or Secondary」字段为列名透视医保信息字段,生成
Primary、Secondary两列 - 按Visit ID合并两部分透视结果,即可得到你需要的输出结构
原有代码问题说明
- 之前写的pivot方法用了不存在的
DX ID作为取值字段,参数配置错误 - melt函数的作用是把宽表转为长表,你需要的是长表转宽表,所以效果和预期完全相反
内容的提问来源于stack exchange,提问作者Mystical Me
相关产品推荐
相关产品推荐

