#python #python-3.x #data-structures #data-science
Вопрос:
У меня есть содержимое файла CSV, как показано ниже:
name_1,dept_code_1,name_2,dept_code_2,name_3,dept_code_3 ABC,CODE1,ABC CHILD 1,CODE1-1,, ABC,CODE1,ABC CHILD 1,CODE1-1,ABC CHILD 1-1-1,CODE1-1-1 ABC,CODE1,ABC CHILD 1,CODE1-1,ABC CHILD 1-1-2,CODE1-1-2 ABC,CODE1,ABC CHILD 2,CODE1-2,ABC CHILD 1-2-1,CODE1-2-1 ABC,CODE1,ABC CHILD 2,CODE1-2,ABC CHILD 1-2-2,CODE1-2-2 XYZ,CODE2,XYZ CHILD,CODE2-2,,
Я хотел бы построить иерархические данные с помощью этой логики:
- имя_1,dept_code_1: родитель
- имя 2,dept_code_2: дочерний элемент 1 (родитель)
- имя 3,код отдела 3: ребенок 2 лет
Файл CSV может содержать больше столбцов: name_4,dept_code_4 … name_n,dept_code_n
Ожидаемый результат вышеуказанного CSV:
ABC,CODE1,,,,,OK ABC,CODE1,ABC CHILD 1,CODE1-1,,,OK ABC,CODE1,ABC CHILD 1,CODE1-1,ABC CHILD 1-1-1,CODE1-1-1,OK ABC,CODE1,ABC CHILD 1,CODE1-1,ABC CHILD 1-1-2,CODE1-1-2,OK ABC,CODE1,ABC CHILD 2,CODE1-2,,,OK ABC,CODE1,ABC CHILD 2,CODE1-2,ABC CHILD 1-2-1,CODE1-2-1,OK ABC,CODE1,ABC CHILD 2,CODE1-2,ABC CHILD 1-2-2,CODE1-2-2,OK XYZ,CODE2,,,,,OK XYZ,CODE2,XYZ CHILD,CODE2-1,,,OK
Кто-нибудь посоветует мне, как лучше всего это сделать с помощью Python?
Это код, который я пытаюсь:
import os import csv from io import StringIO with open(os.path.join('', 'test.csv')) as csv_file: content = StringIO(csv_file.read()) csv_rows = csv.DictReader(content, delimiter=',') final_data = {} for row in csv_rows: if row['name_1']: if row['name_1'] not in final_data: final_data[row['name_1']] = {} final_data[row['name_1']]['dept_code_1'] = row['dept_code_1'] if row['name_2']: if row['name_2'] not in final_data[row['name_1']]: final_data[row['name_1']][row['name_2']] = {} final_data[row['name_1']][row['name_2']]['dept_code_2'] = row['dept_code_2'] if row['name_3']: if row['name_3'] not in final_data[row['name_1']][row['name_2']]: final_data[row['name_1']][row['name_2']][row['name_3']] = {} final_data[row['name_1']][row['name_2']][row['name_3']]['dept_code_3'] = row['dept_code_3'] print(final_data)
Комментарии:
1. Привет и добро пожаловать в SO. Для сообщества важно, чтобы вы продемонстрировали, что вы также работаете над решением своей проблемы. Лучший способ сделать это-включить текст кода, который вы пробовали, даже если он работает не совсем правильно. Если вы понятия не имеете, с чего начать, ознакомьтесь с
collections
модулем, в частностиcollections.defaultdict
, и или встроенным словарным методомsetdefault()
2. @JonSG: Спасибо за ваш комментарий. Я добавил код, который пытаюсь сделать.
Ответ №1:
Вы можете взглянуть на itertools.groupby
import os import csv from io import StringIO from itertools import groupby with open(os.path.join('', 'test.csv')) as csv_file: content = StringIO(csv_file.read()) csv_rows = csv.DictReader(content, delimiter=',') group_by_dept_code_1 = groupby(csv_rows, lambda n: n['dept_code_1'])