分析Pandas中的数据,其中一些值是dicts列表

2024-09-30 22:11:23 发布

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

我得到了一个愚蠢的csv,里面有20000行数据,只涉及到300个案例,所以我想尝试以一种更有意义的方式来分组,所以我现在有了一个包含300个案例的文本文件,下面是其中两个案例的示例:

[{“治疗”:[“”],“年份”:“2004”,“原因”:“故意/疑似自杀”,“病例号”:“9999”,“结果”:“轻微影响”,“症状”:[“嗜睡/嗜睡/相关”],“病例药物”:[{“物质”:“瑞沃替利”,“泊松指数描述”:“苯二氮卓”,“SubstanceFormula\u 20c”:“液体”,“SubstanceProductCode”:“999”,“常规经验”:“摄入”,“SubstanceGeneric\u AAPCC\u Code”:“999”},{“Substance”:“hydromephone X 15注射器6 MG EA”,“poissindex\u Desc”:“hydromephone”,“SubstanceFormula\u 20c”:“LIQUID”,“SubstanceProductCode”:“9999”,“RouteExp”:“INGEST”,“SubstanceGeneric\u AAPCC\u Code”:“9999”}],“Acuity”:“Acute”,“AgeGroup”:“90-99岁”,“SEX”:“zoidberg},
{“治疗”:[“单剂量活性炭”,“静脉输液”],“年份”:“2006”,“原因”:“无意/一般”,“病例编号”:“8888”,“结果”:“可能的最小临床效果”,“症状”:[”“],“病例药物”:[{“物质”:“洛哌丁胺2MG X 1/2”,“泊松指数描述”:“洛哌丁胺”,“SubstanceFormula\u 20c”:“固体(片剂/胶囊/胶囊)”,“SubstanceProductCode”:“88”,“RouteExp”:“摄入”,“SubstanceGeneric \u AAPCC \u Code”:“88”}],“Acuity”:“急性”,“年龄组”:“15岁”,“性别”:“F”}]

像“Year”这样的值对于每个案例只有1个值“症状”有一个值列表,“病例药物”有一个目录列表。这种格式对我来说很有意义,因为一个人可以有多种药物,而且每种药物都有多个相关属性。我真的不想平展数据,因为像drug变量这样的变量实际上没有最大的条目数,所以有可能如果我有“drug1,drug2,drug3”,那么下次我得到数据时,我必须添加一个“drug4”。你知道吗

目前,我可以加载熊猫文件和分析它的大部分。对于列表值,我遇到了另一个堆栈交换帖子,它建议我可以使用:

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

这很管用。我相信我能想出如何用类似的方法做其他分析。我仍然不确定我将如何着手分析这个案例。我可以创建自己的函数来循环并读取数据,但我想知道pandas中是否有现有的功能可以做到这一点。例如,如果我想计算“case\u drugs”变量的“substance”值中出现“RIVOTRIL”的次数,该怎么办?你知道吗

或者如果你认为我最好用另一种方式存储数据,那也是可以接受的答案!你知道吗

谢谢


Tags: 数据症状列表方式code原因案例药物
1条回答
网友
1楼 · 发布于 2024-09-30 22:11:23

对于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中的dict列表拆分(分解)到它自己的行,并使用CaseNumber作为索引。你知道吗

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

相关问题 更多 >