Нужна помощь в построении иерархических данных с помощью Python

#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'])