У меня есть таблица длинного формата, в которой показано, какие поставщики назначены какой услуге для набора местоположений. Для каждого местоположения и услуги существует произвольное количество уровней назначения (например, если первый поставщик не может предоставить услугу, работа будет передана второму поставщику).
Я пытаюсь развернуть эту таблицу в широкий формат и знаю, что определенно делаю что-то не так. В ожидаемой широкоформатной таблице после местоположения должен быть двойной заголовок, где уровень 0 — это имя службы, а уровень 1 — каждый номер назначения. Поэтому при экспорте в Excel каждое имя службы должно охватывать произвольное количество столбцов назначения.
Фактический результат не соответствует ожидаемому. Я думаю, что либо я неправильно поворачиваюсь, либо pd.pivot не подходит для этого. Тот факт, что мне нужно вручную отсортировать и настроить MultiIndex после поворота, говорит о многом.
Как мне настроить свой код, чтобы получить ожидаемый результат?
Пример кода
импортировать панд как pd импортировать numpy как np образец_данных = [ {'Местоположение': 'обязательно', 'ServiceSpecialty': 'обязательно', «Задание 1»: «необязательно», «Задание 2»: «необязательно», «Задание 3»: «необязательно», «Задание 4»: «необязательно», «Задание 5»: «необязательно»}, {'Местоположение': '123 Main Street', «Специальное обслуживание»: «Бытовая техника», «Задание 1»: «Джон Смит», «Задание 2»: np.nan, «Задание 3»: np.nan, «Задание 4»: np.nan, «Задание 5»: np.nan}, {'Местоположение': '123 Main Street', «Специализация в сфере услуг»: «Плотницкие работы/Разнорабочий», «Задание 1»: «Поставщик ACME A», «Задание 2»: «Магазин Mom & Pop», «Задание 3»: «Эми Смит», «Задание 4»: np.nan, «Задание 5»: np.nan}, {'Местоположение': '123 Main Street', «Специализация обслуживания»: «Двери», «Задание 1»: «Абугида», «Задание 2»: «ACME Industries», «Задание 3»: «Магазин Mom & Pop», «Задание 4»: «Эми Смит», «Задание 5»: «Джон Смит»}, {'Местоположение': '456 Broadway Ave', «Специальное обслуживание»: «Бытовая техника», «Задание 1»: «Джон Смит», «Задание 2»: np.nan, «Задание 3»: np.nan, «Задание 4»: np.nan, «Задание 5»: np.nan}, {'Местоположение': '456 Broadway Ave', «Специализация в сфере услуг»: «Плотницкие работы/Разнорабочий», «Задание 1»: «Поставщик ACME A», «Задание 2»: «Магазин Mom & Pop», «Задание 3»: «Эми Смит», «Задание 4»: np.nan, «Задание 5»: np.nan}, {'Местоположение': '456 Broadway Ave', «Специализация обслуживания»: «Двери», «Задание 1»: «Абугида», «Задание 2»: «ACME Industries», «Задание 3»: «Магазин Mom & Pop», «Задание 4»: «Эми Смит», «Задание 5»: «Джон Смит»} ] df = pd.DataFrame.from_dict(sample_data) # Удалите ненужный вторичный заголовок (обязательно/необязательно) и поверните df = df.drop(индекс=df.index[0], ось=0) df = df.pivot(index='Location', columns='ServiceSpecialty').reset_index() # Удалите все полностью пустые столбцы (например, «Банкомат» имеет только 1 назначение, а «Плотницкие/Разнорабочие» — 3). # Мы хотим сохранить только заполненные столбцы «Назначение». df = df.dropna(axis=1, How='all') # Очистите заголовок MultiIndex (удалите имена и поместите ServiceSpecialty над Assignment). # столбца. Это приведет к тому, что ServiceSpecialty будет охватывать все столбцы назначения при экспорте в Excel). df.index.name = Нет df.columns.names = (Нет, Нет) df.columns = df.columns.swaplevel(0,1) # Сортируем столбцы MultiIndex по ServiceSpecialty, а не по назначению cols_location = [('', 'Местоположение')] cols_assignments = [c для c в df.columns, если c[0] != ''] cols_assignments.sort(ключ=лямбда c: c[0]) cols_updated = cols_location + cols_assignments df.columns = pd.MultiIndex.from_tuples(cols_updated) # Записываем вывод в файл с pd.ExcelWriter('current_output.xlsx', engine='xlsxwriter') в качестве записи: df.to_excel (писатель) Пример ввода

Текущий результат

Ожидаемый результат
