在python中显示具有附加变量的组中列值总和的唯一名称

2024-09-28 01:31:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习Python,我认为从事一个项目可能是学习Python的最好方法。我有大约200000行数据,其中的数据显示了患者的药物列表。这是一个数据样本。你知道吗

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 MMEDRUGNAME应该显示MME较高的数据帧。换句话说,每个患者的数据帧应该只有一行。你知道吗

我试过的一件事是

groupby_ptname = semp.groupby('PTNAME').apply(lambda x: x.MME.sum())

它显示了具有总MME的唯一患者名称,但我不知道如何在这个新的数据帧中添加其他变量。你知道吗


Tags: 数据方法患者erdrpatienthclmg
2条回答

再来看看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]

你可以这样做:

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

相关问题 更多 >

    热门问题