簡體   English   中英

CSV到Python中的嵌套詞典(無熊貓)

[英]CSV to nested dictionary in Python (without Pandas)

我有一個CSV,我希望通過根據列中的值進行分組將其處理為嵌套字典。 格式如下:

sample, date, depth, analyte, result
'ABC', '01/01/2018', '3', 'LEAD', 0.22
'ABC', '02/01/2018', '3', 'LEAD', 0.25
'ABC', '01/01/2018', '5', 'LEAD', 0.19
'ABC', '02/01/2018', '5', 'LEAD', 0.18
'ABC', '01/01/2018', '3', 'MERCURY', 0.97
'ABC', '02/01/2018', '3', 'MERCURY', 0.95
'ABC', '01/01/2018', '5', 'MERCURY', 0.34
'ABC', '02/01/2018', '5', 'MERCURY', 0.11
'DEF', '01/01/2018', '3', 'LEAD', 0.07
'DEF', '02/01/2018', '3', 'LEAD', 0.04
'DEF', '01/01/2018', '5', 'LEAD', 0.16
'DEF', '02/01/2018', '5', 'LEAD', 0.65
'DEF', '01/01/2018', '3', 'MERCURY', 0.03
'DEF', '02/01/2018', '3', 'MERCURY', 0.01
'DEF', '01/01/2018', '5', 'MERCURY', 0.11
'DEF', '02/01/2018', '5', 'MERCURY', 0.13

我希望我的最終字典看起來像:
dictionary = {sample: {date: {depth: [analyte, result], [analyte, result] ... }}}

我希望我可以通過輸入以下內容來遍歷字典以訪問唯一結果的每個塊:
dictionary[sample][date][depth]

例如:
dictionary['ABC']['01/01/2018']['5'] = [['LEAD', 0.19], ['MERCURY', 0.34]]

我想避免使用Pandas,盡管我知道它可能非常適合完成任務-我正在尋找Pythonic解決方案。 這很困難-因為我必須容納多個樣品,多個日期,多個深度和多個分析物。 我是一個初學者,而我嘗試過的嵌套循環讓我不寒而栗。

任何幫助表示贊賞。

這是使用csv.DictReadercollections.defaultdict一種解決方案。 您可以定義特定的嵌套字典結構。 然后遍歷輸入文件一次,為DictReader生成的每個字典添加項。

使用類似的方法,您還可以選擇帶有元組鍵的字典。 這對於查找將更有效,但會使迭代更加麻煩。

from collections import defaultdict
import csv

d = defaultdict(lambda: defaultdict(lambda: defaultdict(list)))

with open('file.csv', 'r') as fin:

    reader = csv.DictReader(fin, quotechar="'", skipinitialspace=True)

    for i in reader:
        d[i['sample']][i['date']][i['depth']].append([i['analyte'], float(i['result'])])

結果

print(d)

defaultdict({'ABC': defaultdict({'01/01/2018': defaultdict(list,
                                      {'3': [['LEAD', 0.22], ['MERCURY', 0.97]],
                                       '5': [['LEAD', 0.19], ['MERCURY', 0.34]]}),
                                 '02/01/2018': defaultdict(list,
                                      {'3': [['LEAD', 0.25], ['MERCURY', 0.95]],
                                       '5': [['LEAD', 0.18], ['MERCURY', 0.11]]})}),
             'DEF': defaultdict({'01/01/2018': defaultdict(list,
                                      {'3': [['LEAD', 0.07],
                                ....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM