如何在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
相关产品推荐
相关产品推荐

