我正在学习Python,并认为在项目上工作可能是学习它的最佳方式。我有大约200,000行数据,其中数据显示患者的药物清单。这是一个数据样本。
PTID PTNAME MME DRNAME DRUGNAME SPLY STR QTY FACTOR
1 PATIENT, A 2700 DR, A OXYCODONE HCL 15 MG 30 15 120 1.5
1 PATIENT, A 2700 DR, B OXYCODONE HCL 15 MG 30 15 120 1.5
2 PATIENT, B 4050 DR, C MORPHINE SULFATE ER 15 MG 30 15 270 1
2 PATIENT, B 4050 DR, C MORPHINE SULFATE ER 15 MG 30 15 270 1
2 PATIENT, B 840 DR, A OXYCODONE-ACETAMINOPHE 10MG-32 14 10 56 1.5
2 PATIENT, B 1350 DR, C OXYCODONE-ACETAMINOPHE 5 MG-32 15 5 180 1.5
3 PATIENT, C 1350 DR, C OXYCODONE-ACETAMINOPHE 5 MG-32 15 5 180 1.5
3 PATIENT, C 1800 DR, D OXYCODONE-ACETAMINOPHE 10MG-32 30 10 120 1.5
我一直在考虑这个问题,并尝试了很多方法,但没有一个代码产生任何结果或任何意义。老实说,我甚至不知道从哪里开始。一点帮助将受到高度赞赏。
因此,我想要做的是整合每位患者的数据并计算每位患者的Total MME
。 DRUGNAME
应该显示具有更高MME的那个。换句话说,每个患者的数据帧应该只有一行。
我尝试过的一件事是
groupby_ptname = semp.groupby('PTNAME').apply(lambda x: x.MME.sum())
显示具有总MME的唯一患者姓名,但我不确定如何在此新数据框中添加其他变量。
答案 0 :(得分:1)
再看一下pandas groupby methods的文档。
这可能适合您:
#first get the total MME for each patient and drug combination
total_mme=semp.groupby(['PTNAME','DRUGNAME'])['MME'].sum()
#this will be a series object with index corresponding to PTNAME and DRUGNAME and values corresponding to the total MME
#now get the indices corresponding to the drug with the max MME total
max_drug_indices=total_mme.groupby(level='PTNAME').idxmax()
#index the total MME with these indices
out=total_mme[max_drug_indices]
答案 1 :(得分:1)
IIUC你可以这样做:
In [62]: df.sort_values('MME').groupby('PTNAME').agg({'MME':'sum', 'DRUGNAME':'last'})
Out[62]:
DRUGNAME MME
PTNAME
PATIENT, A OXYCODONE HCL 15 MG 5400
PATIENT, B MORPHINE SULFATE ER 15 MG 10290
PATIENT, C OXYCODONE-ACETAMINOPHE 10MG-32 3150
或.reset_index()
:
In [64]: df.sort_values('MME').groupby('PTNAME').agg({'MME':'sum', 'DRUGNAME':'last'}).reset_index()
Out[64]:
PTNAME DRUGNAME MME
0 PATIENT, A OXYCODONE HCL 15 MG 5400
1 PATIENT, B MORPHINE SULFATE ER 15 MG 10290
2 PATIENT, C OXYCODONE-ACETAMINOPHE 10MG-32 3150
更新:使用agg()
功能
In [84]: agg_funcs = {
...: 'MME':{'MME_max':'last',
...: 'MME_total':'sum'},
...: 'DRUGNAME':{'DRUGNAME_max_MME':'last'}
...: }
...:
...: rslt = (df.sort_values('MME')
...: .groupby('PTNAME')
...: .agg(agg_funcs)
...: .reset_index()
...: )
...: rslt.columns = [tup[1] if tup[1] else tup[0] for tup in rslt.columns]
...:
In [85]: rslt
Out[85]:
PTNAME MME_total MME_max DRUGNAME_max_MME
0 PATIENT, A 5400 2700 OXYCODONE HCL 15 MG
1 PATIENT, B 10290 4050 MORPHINE SULFATE ER 15 MG
2 PATIENT, C 3150 1800 OXYCODONE-ACETAMINOPHE 10MG-32