Я работаю с данными в Pandas, которые импортируются из формата .ODS, через библиотеку pyexcel_ods3 , которая выдает orderDict.
Данные Открытого правительства размещены здесь . Из этого примера вы можете видеть , что в рабочей книге несколько листов с одинаковыми заголовками столбцов в строке 1 (индексация на основе нуля).
Названия листов относятся к категориям продуктов питания, таким как «яблоки» и «говядина». Внутри каждого листа есть подкатегории, такие как «еда» и «приготовление» (для яблок) и «стейк» и «субпродукты» для говядины. Подкатегории представляют собой одну ячейку, объединенную по всему листу, и могут появиться в любой строке после 1. Проблема, с которой я сталкиваюсь, заключается в том, как обработать импорт упорядоченного словаря и сделать что-то полезное с этими подкатегориями .
Вот небольшая выдержка из приведенного словаря:
{'Animal_fats_BNA': [['Expert Committee on Pesticide Residues in Food Sample Details 2018 Animal fats '],
['Sample ID','Date of Sampling','Description','Country of Origin','Retail Outlet','Address','Brand Name','Packer / Manufacturer','Pesticide residues found in mg/kg (MRL)'],
['Dripping '],
['2464/2018',datetime.datetime(2018, 6, 18, 0, 0),'The best natural beef dripping','UK','Morrisons','Basingstoke Road Reading RG2 0HB','Morrisons ','Morrisons Gain Lane Bradford BD3 7DL','None were detected above the set RL']}
Там вы можете увидеть подкатегорию «Капание».
Я мог бы написать Python скрипт для решения этой проблемы, начинающийся что-то вроде:
# # All arrays within the df need to be the same length. This checks the max length of the lists
# #i.e. the length of a row, and extends all lists to that length with null values.
for key in spreadsheet_data_dict.keys():
for lst in spreadsheet_data_dict[key]:
maxlen = max(map(len,spreadsheet_data_dict[key]))
if len(lst) < maxlen:
lst.extend("null" for _ in range(maxlen - len(lst)))
def identify_categories(row): ### Could use this to put categories as their own column and then fill forward.
cells = [cell.value for cell in row] #this makes a list of all the cells in a row
if cells[0] != None and all(x is None for x in cells[1:]): #this tests if the first cell has some value and the others are empty
return True
else: # other non-category rows will not meet the conditions and will return FALSE
return False
Для краткости я не буду go более подробно рассказывать о том, как я буду создавать новые столбцы и заполнять их до следующей определенной "строки категории".
Тем не менее, я надеюсь, что мне не понадобится хакерский Python подход к решению этой проблемы, так как я уверен, Pandas имеет Pandoni c способ решения этой самой проблемы ... я просто не могу его найти.
Какой вывод мне нужен:
Либо 1) Иерархическая индексация , например, здесь
ИЛИ 2) Новый Столбец подкатегории , в котором указывается категория продуктов, на которую изменяется категория