CSV для вложенного словаря в Python (без панд) - PullRequest
0 голосов
/ 31 мая 2018

У меня есть 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]]

Я бы хотел избежать использования панд, хотя яЯ знаю, что это может быть хорошо подходит для решения этой задачи - я ищу решение Pythonic.Это сложно - потому что мне нужно разместить несколько образцов, несколько дат, несколько глубин и несколько аналитов.Я новичок, и вложенные циклы, которые я пробовал, зажгли мой мозг.

Любая помощь приветствуется ..

1 Ответ

0 голосов
/ 31 мая 2018

Это одно решение, использующее csv.DictReader и collections.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],
                                ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...