将DataFrame的Rank值转置为新列:提取患者第1、4次就诊记录
解决方法
首先修正你生成排名列的代码,原代码存在括号嵌套错误,正确的排名逻辑应该是先按patientid和encounter排序,再分组对encounter排名:
# 修正Rank列的生成逻辑 PHQ['Rank'] = PHQ.sort_values(['patientid', 'encounter']) \ .groupby(['patientid'])['encounter'] \ .rank(method='min').astype(int)
接下来通过筛选+转置得到你要的结果:
- 先筛选出排名为1和4的就诊记录
- 使用
pivot将排名转成列,并重命名为目标列名 - 重置索引确保
patientid作为普通列存在
完整代码如下:
# 筛选第1和第4次就诊记录 filtered = PHQ[PHQ['Rank'].isin([1, 4])] # 转置数据,将Rank转为列,替换`check_value`为你实际存储就诊检查结果的字段名 result = filtered.pivot( index='patientid', columns='Rank', values='check_value' ).rename(columns={1: 'phq1_check', 4: 'phq4_check'}).reset_index() # 可选:处理无第4次就诊的患者空值 result = result.fillna({'phq4_check': None})
额外优化
如果你的encounter字段本身就是按就诊顺序编号的(比如直接是1、2、3...),可以跳过生成Rank列的步骤,直接筛选转置,效率更高:
filtered = PHQ[PHQ['encounter'].isin([1, 4])] result = filtered.pivot(index='patientid', columns='encounter', values='check_value') \ .rename(columns={1: 'phq1_check', 4: 'phq4_check'}).reset_index()
内容的提问来源于stack exchange,提问作者BP12
相关产品推荐
相关产品推荐

