如何合并dfICU与dfPts并透视,显示所有ICU单元的频次(含0值)
解决方法
你的代码只用到了dfPts里出现过的ICU单元,自然没法包含dfICU里的全部ICU。要解决这个问题,核心是先让每一条就诊记录(PtsID+VisitID)都和所有ICU单元做匹配,然后再透视,具体步骤如下:
- 生成就诊记录与所有ICU的完整组合
先提取dfPts中唯一的就诊标识对(PtsID、VisitID),再和dfICU做交叉连接,确保每条就诊记录都对应所有ICU:
import pandas as pd unique_visits = dfPts[['PtsID', 'VisitID']].drop_duplicates() full_matches = unique_visits.merge(dfICU, how='cross')
- 合并原始频次数据并补0
把上面的完整组合和dfPts合并,把已有频次填充进去,没有记录的ICU直接补0:
merged_data = full_matches.merge( dfPts[['PtsID', 'VisitID', 'ICU', 'Frequency']], on=['PtsID', 'VisitID', 'ICU'], how='left' ).fillna({'Frequency': 0})
- 透视生成目标表格
最后做透视,行设为PtsID和VisitID,列是ICU,值取Frequency:
final_df = merged_data.pivot( index=['PtsID', 'VisitID'], columns='ICU', values='Frequency' ).reset_index()
完整代码
import pandas as pd # 生成所有就诊-ICU组合 unique_visits = dfPts[['PtsID', 'VisitID']].drop_duplicates() full_matches = unique_visits.merge(dfICU, how='cross') # 合并原始数据并填充缺失值 merged_data = full_matches.merge( dfPts[['PtsID', 'VisitID', 'ICU', 'Frequency']], on=['PtsID', 'VisitID', 'ICU'], how='left' ).fillna({'Frequency': 0}) # 透视得到结果 final_df = merged_data.pivot( index=['PtsID', 'VisitID'], columns='ICU', values='Frequency' ).reset_index()
这样处理后,结果里就会包含dfICU中的所有ICU单元,没出现的就诊-ICU组合频次自动显示0。
内容的提问来源于stack exchange,提问作者asmgx
相关产品推荐
相关产品推荐

