如何不通过求和聚合行?实现患者问题DataFrame的宽表转换
解决方法:无需循环,用Pandas快速转换数据格式
嘿,你这个需求其实用Pandas的内置函数就能轻松实现,完全不用写复杂的循环或者手动聚合!下面给你两种简单高效的方法:
方法1:使用pivot_table(直观易懂)
pivot_table是Pandas里专门用来重塑数据的工具,刚好匹配你的需求:把每个患者的病症转成列,并用0/1标记是否存在。
import pandas as pd # 先构造你的示例数据(实际使用时替换成你的DataFrame即可) df = pd.DataFrame({ 'PAT_MRN_ID': [9641956, 9641956, 8227510, 8165474, 7860000], 'Problem': ['Headache', 'Stomach_ache', 'Headache', 'Chicken_pox', 'Stomach_ache'] }) # 用pivot_table转换格式 result_df = df.pivot_table( index='PAT_MRN_ID', # 行:患者ID columns='Problem', # 列:病症 aggfunc=lambda x: 1, # 只要存在该病症就标记为1 fill_value=0 # 不存在的病症填0 ).reset_index() # 去掉列名的层级标签,让格式更干净 result_df.columns.name = None
运行后得到的result_df就是你想要的格式啦!
方法2:使用get_dummies + groupby(更简洁)
如果你喜欢更简洁的写法,可以用get_dummies生成哑变量,再按患者ID分组求和:
import pandas as pd # 同样先构造示例数据 df = pd.DataFrame({ 'PAT_MRN_ID': [9641956, 9641956, 8227510, 8165474, 7860000], 'Problem': ['Headache', 'Stomach_ache', 'Headache', 'Chicken_pox', 'Stomach_ache'] }) # 生成病症的哑变量列 problem_dummies = pd.get_dummies(df['Problem']) # 合并患者ID和哑变量列,再按ID分组求和(同一个患者的病症会累加为1,无则为0) result_df = pd.concat([df['PAT_MRN_ID'], problem_dummies], axis=1)\ .groupby('PAT_MRN_ID').sum()\ .reset_index()
这两种方法都避免了手动循环,而且处理大数据量时效率比循环高得多,完全满足你的需求~
内容的提问来源于stack exchange,提问作者Stijn Geraats
相关产品推荐
相关产品推荐

