首页 > 解决方案 > 分析 pandas 中的数据,其中一些值是 dicts 列表

问题描述

我得到了一个愚蠢的 csv,其中包含大约 20,000 行数据,仅涉及约 300 个案例,所以我想尝试以更有意义的方式对事物进行分组,所以我现在有一个包含 300 个案例的文本文件,两个样本其中如下:

[{“治疗”:[“”],“年份”:“2004”,“原因”:“故意/疑似自杀”,“案例编号”:“9999”,“结果”:“轻微影响”,“症状” :[“昏昏欲睡/嗜睡/相关”],“case_drugs”:[{“物质”:“RIVOTRIL”,“Poisindex_Desc”:“BENZODIAZEPINE”,“SubstanceFormula_20c”:“LIQUID”,“SubstanceProductCode”:“999”,“ RouteExp”:“INGEST”,“SubstanceGeneric_AAPCC_Code”:“999”},{“Substance”:“HYDROMORPHONE X 15 SYRINGES 6 MG EA”,“Poisindex_Desc”:“HYDROMORPHONE”,“SubstanceFormula_20c”:“LIQUID”,“SubstanceProductCode” : "9999",“RouteExp”:“INGEST”,“SubstanceGeneric_AAPCC_Code”:“9999”}],“Acuity”:“Acute”,“AgeGroup”:“90-99 岁”,“SEX”:“zoidberg”},
{“治疗”:[“单剂量活性炭”,“静脉输液”],“年份”:“2006”,“原因”:“无意/一般”,“病例编号”:“8888”,“结果”:“最小的临床影响”,“症状”:[“”],“case_drugs”:[{“物质”:“洛哌丁胺 2MG X 1/2”,“Poisindex_Desc”:“洛哌丁胺”,“SubstanceFormula_20c”:“固体(片剂) /CAPSULES/CAPLETS)”,“SubstanceProductCode”:“88”,“RouteExp”:“INGEST”,“SubstanceGeneric_AAPCC_Code”:“88”}],“Acuity”:“Acute”,“AgeGroup”:“L5 yrs”, “性别”:“F”}]

像“Year”这样的东西对于每个案例只有 1 个值。“症状”有一个值列表,“case_drugs”有一个字典列表。这种格式对我来说很有意义,因为一个人可以拥有多种药物,并且每种药物都有与之相关的多个属性。我真的不想展平数据,因为诸如 drug 变量之类的东西并没有真正的最大条目数,所以如果我有“drug1, drug2, drug3”之类的东西,那么下次我得到数据时,我可能会'必须添加一个“drug4”。

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

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

这完美无缺。我确信我可以弄清楚如何用类似的方法进行其他分析。我仍然不确定如何分析 case_drugs 变量。我可以制作自己的函数来循环并读取数据,但我想知道 pandas 中是否存在能够做到这一点的功能。例如,如果我想计算 'RIVOTRIL' 出现在“case_drugs”变量的“substance”值中的次数怎么办?

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

谢谢

标签: pythonlistpandasdictionarynested

解决方案


对于case_drugs变量,一种方法是为其创建另一个数据框。

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_drugs

我首先将字典列表拆分(分解)case_drugs到自己的行中并CaseNumber用作索引。

df_case_drugs = pd.DataFrame(df['case_drugs'].tolist(), index=df['CaseNumber']).stack()
df_case_drugs = df_case_drugs.reset_index()

这为您提供了一个数据框,在名为 0 的列中每行有一个 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

推荐阅读