我得到了一个愚蠢的csv,其中包含20,000行数据,仅涉及约300个案例,所以我想尝试以更有意义的方式对事物进行分组,所以我现在有一个包含300个案例的文本文件,其中两个的样本如下:
[{" Treatment":[""]," Year":" 2004"," Reason&#34 ;:"故意/可疑自杀"," CaseNumber":" 9999"," OutCome":"次要影响" ,"症状":["昏昏欲睡/嗜睡/相关"]," case_drugs":[{" Substance":" RIVOTRIL& #34;," Poisindex_Desc":" BENZODIAZEPINE"," SubstanceFormula_20c":" LIQUID"," SubstanceProductCode":& #34; 999"," RouteExp":" INGEST"," SubstanceGeneric_AAPCC_Code":" 999"},{"物质":" HYDROMORPHONE X 15 SYRINGES 6 MG EA"," Poisindex_Desc":" HYDROMORPHONE"," SubstanceFormula_20c":&#34 ; LIQUID"," SubstanceProductCode":" 9999"," RouteExp":" INGEST"," SubstanceGeneric_AAPCC_Code" :" 9999"}]," Acuity":"急性"," AgeGroup":" 90-99岁" ," SEX":" zoidberg" },
{"治疗":["单剂量活性炭"," IV液体"],"年":" 2006&#34 ;,"原因":"无意/一般"," CaseNumber":" 8888"," OutCome":& #34;可能的最小临床影响","症状":[""]," case_drugs":[{" Substance" :" LOPERAMIDE 2MG X 1/2"," Poisindex_Desc":" LOPERAMIDE"," SubstanceFormula_20c":" SOLID(TABLETS / CAPSULES / CAPLETS)"," SubstanceProductCode":" 88"," RouteExp":" INGEST"," SubstanceGeneric_AAPCC_Code& #34;:" 88"}]," Acuity":"急性"," AgeGroup":" L5岁&#34 ;," SEX":" F"}]
类似于"年"每种情况只有1个值。 "症状"有一个值列表," case_drugs"有一个dicts列表。这种格式对我来说很有意义,因为1个人可以有多种药物,每种药物都有多种与之相关的属性。我并不是真的想要压扁数据,因为像药物变量这样的东西确实没有最大数量的条目,所以如果我喜欢" drug1,drug2可能,药物3"然后,下次我得到数据时,我必须添加一个" drug4"。
目前,我可以在pandas中加载文件并分析其中的大部分内容。对于列表值,我发现另一个堆栈交换帖子,建议我可以使用它:
df['Symptoms'].apply(lambda x: pd.Series(x).value_counts()).sum()
完美无缺。我确定我可以用类似的方法弄清楚如何进行其他分析。我仍然不确定如何分析case_drugs变量。我可以使自己的函数循环并读取数据,但我想知道pandas中是否存在能够执行此操作的现有功能。例如,如果我想计算次数' RIVOTRIL'出现在"物质"值" case_drugs"变量?
或者,如果您认为我以不同方式存储数据会更好,那也是可以接受的答案!
由于
答案 0 :(得分:0)
对于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。(您可以重命名该列,但我们仍然不保留此列,因此它并不重要。)
然后将dicts转换为数据帧。
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