Python 分析熊猫中的数据,其中一些值是DICT列表

Python 分析熊猫中的数据,其中一些值是DICT列表,python,list,pandas,dictionary,nested,Python,List,Pandas,Dictionary,Nested,我收到了一个愚蠢的csv,其中包含20000行数据,仅涉及300个案例,因此我想尝试以更有意义的方式对内容进行分组,因此我现在有一个包含300个案例的文本文件,其中两个示例如下: 【治疗】:【年】:【2004】,【原因】:【故意/疑似自杀】,【病例编号】:【9999】,【结果】:【轻微影响】,【症状】:【嗜睡/嗜睡/相关】,【病例药物】:【药物】:【药物】:【利沃曲利】,【泊松指数】:【苯二氮卓类】,【药水】,【药水】:【药水代码】:【999】,【常规药物】:【摄入】,“原料药通用代码”:“99

我收到了一个愚蠢的csv,其中包含20000行数据,仅涉及300个案例,因此我想尝试以更有意义的方式对内容进行分组,因此我现在有一个包含300个案例的文本文件,其中两个示例如下:

【治疗】:【年】:【2004】,【原因】:【故意/疑似自杀】,【病例编号】:【9999】,【结果】:【轻微影响】,【症状】:【嗜睡/嗜睡/相关】,【病例药物】:【药物】:【药物】:【利沃曲利】,【泊松指数】:【苯二氮卓类】,【药水】,【药水】:【药水代码】:【999】,【常规药物】:【摄入】,“原料药通用代码”:“999”},{“原料药”:“氢吗啡酮X 15注射器6 MG EA”,“泊松指数描述”:“氢吗啡酮”,“原料药通用代码”:“液体”,“原料药产品代码”:“9999”,“路线XP”:“摄入”,“原料药通用代码”:“9999”}],“敏锐性”:“急性”,“年龄组”:“90-99岁”,“性别”:“zoidberg”},
{“治疗”:[“单剂量活性炭”,“静脉输液”],“年份”:“2006年”,“原因”:“无意/一般”,“病例编号”:“8888”,“结果”:“可能的最小临床效果”,“症状”:[“”],“病例药物”:[{“物质”:“洛哌丁胺2MG X 1/2”,“泊松指数描述”:“洛哌丁胺”,“药物配方”:“固体(片剂/胶囊/小片)”,”SubstanceProductCode:“88”,“RouteExp:“摄入”,“SubstanceGeneric_AAPCC__Code:“88”}],“敏锐度”:“急性”,“年龄组”:“15岁”,“性别”:“F”}]

像“年”这样的词对于每个病例只有一个值,“症状”有一个值列表,还有“病例\药物”“有一份口述清单。这种格式对我来说很有意义,因为一个人可以有多种药物,而且每种药物都有与其相关的多个属性。我真的不想平展数据,因为药物变量之类的东西实际上没有最大数量的条目,所以如果我有“药物1,药物2,药物3”,那么下次我得到数据时,我就必须添加“药物4”

目前,我可以在pandas中加载文件并分析大部分内容。对于列表值,我遇到了另一个stack exchange帖子,它建议我可以使用以下内容:

df['Symptoms'].apply(λx:pd.Series(x).value_counts()).sum()

那很好用。我相信我能想出如何用类似的方法进行其他分析。我仍然不确定如何分析case_drugs变量。我可以创建自己的函数来循环并读取数据,但我想知道pandas中是否存在能够实现这一点的现有功能。例如,如果我想计算“case_drugs”变量的“substance”值中出现“RIVOTRIL”的次数,该怎么办

或者,如果您认为我最好以另一种方式存储数据,这也是一个可以接受的答案


感谢
case\u druges
变量,一种方法是为它创建另一个数据帧

df_case_drugs = pd.DataFrame(df['case_drugs'].values[0])
df_case_drugs['Substance'].value_counts()
>>>
RIVOTRIL                               1
HYDROMORPHONE X 15 SYRINGES 6 MG EA    1
更新: 创建包含
案例中所有条目的数据框

我首先将
case\u druges
中的dicts列表拆分(分解)到自己的行中,并使用
case number
作为索引

df_case_drugs = pd.DataFrame(df['case_drugs'].tolist(), index=df['CaseNumber']).stack()
df_case_drugs = df_case_drugs.reset_index()
这将在名为0的列中为您提供一个每行一个dict的数据帧。(您可以重命名该列,但我们不会保留该列,因此这并不重要。)

然后将dict转换为数据帧

df_case_drugs = pd.concat([df_case_drugs['CaseNumber'], 
    pd.DataFrame(df_case_drugs[0].tolist())], axis=1)
计数值:

df_case_drugs['Substance'].value_counts()
>>>
RIVOTRIL                               1
LOPERAMIDE 2MG X 1/2                   1
HYDROMORPHONE X 15 SYRINGES 6 MG EA    1

谢谢我喜欢这个解决方案。为了对case_drugs中的所有值执行此操作,我做了以下操作:
df_case_drugs=pd.DataFrame(pcc['case_drugs'].value[0])用于pcc['case_drugs']中的x。value[1:]:df_case_drugs=df_case_drugs.append(pd.DataFrame(x))df_case_drugs['Substance']。value_counts()
您认为有更简单的方法吗?另外,我如何在这个新的DF中添加一列以包含“CaseNumber”变量?@melonfacedoom我编辑了我的答案以扩展解决方案。希望这就是你要找的。