You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中将行值转为属性(列):患者药品数据行转列

嘿,这其实是典型的长表转宽表需求,在Pandas里有几种常用的实现方式,取决于你最终想要的宽表格式。我先模拟下原始数据结构,然后分三种常见场景给你代码方案:

首先,假设你的原始数据长这样:

code
A01
B02
A01
C03
A01
B02

场景1:每个药品编码作为列,标记患者是否使用过

如果你想让每个药品成为独立列,用1/0表示患者是否使用过该药品,用pd.crosstab是最便捷的方式:

import pandas as pd

# 替换成你的真实数据集
df = pd.DataFrame({
    'pid': [1, 1, 2, 3, 3, 3],
    'code': ['A01', 'B02', 'A01', 'C03', 'A01', 'B02']
})

# 生成标记型宽表
wide_df = pd.crosstab(df['pid'], df['code'])
print(wide_df)

运行后输出结果:

code  A01  B02  C03
pid                
1      1    1    0
2      1    0    0
3      1    1    1

场景2:按顺序给患者的药品生成编号列(drug_1, drug_2...)

如果是想把同一个患者的多个药品按出现顺序放在不同的列里(比如第一个药品对应drug_1,第二个对应drug_2),可以用groupby+pivot的组合实现:

# 给每个患者的药品分配序号(从1开始计数)
df['drug_seq'] = df.groupby('pid').cumcount() + 1

# 透视转换为宽表,并重命名列名
wide_df = df.pivot(
    index='pid',
    columns='drug_seq',
    values='code'
).rename(columns=lambda x: f'drug_{x}')

# 可选:把空值替换成空字符串
wide_df = wide_df.fillna('')
print(wide_df)

输出结果:

drug_1 drug_2 drug_3
pid                      
1       A01    B02       
2       A01              
3       C03    A01    B02

场景3:将同一患者的药品合并到单列

如果只是想把一个患者的所有药品合并成一列(用分隔符分隔),可以用groupby+agg快速实现:

# 把同一患者的药品用逗号分隔合并
wide_df = df.groupby('pid')['code'].agg(', '.join).reset_index()
print(wide_df)

输出结果:

pid          code
0    1      A01, B02
1    2           A01
2    3  C03, A01, B02

内容的提问来源于stack exchange,提问作者AnonX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:53:24