Импорт данных электронной таблицы открытых документов в Pandas и работа с заголовками подкатегорий - PullRequest
0 голосов
/ 28 января 2020

Я работаю с данными в 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) Иерархическая индексация , например, здесь Example of hierarchical indexing

ИЛИ 2) Новый Столбец подкатегории , в котором указывается категория продуктов, на которую изменяется категория

Mock up of how sub-category columns would look

...