Индекс кадра данных pandas в объединенную ячейку HTML

У меня есть фрейм данных pandas, как показано ниже.

import pandas as pd
data = {
    'A': [1, 1, 2, 2, 3],
    'B': [10, 10, 20, 20, 30],
    'C': [100, 101, 200, 201, 300],
    'D': ['X', 'X', 'Y', 'Y', 'Z'],
    'E': ['Alpha', 'Beta', 'Beta', 'Gamma', 'Gamma'],
    'F': [1000, 1001, 1002, 1003, 1004]
}
df = pd.DataFrame(data)

Я уже ссылалась на этот пост сюда. Но это может не помочь в достижении моей цели, поскольку у меня более 300 файлов.

Моя цель - сделать следующее

  1. У меня есть более 300 html-файлов, к которым я хотел бы применить это форматирование.

Проблема в том, что когда я пытаюсь индексировать столбцы (с целью объединения), макет выходит из строя и приводит к уродливому результату, как показано ниже.

res = df.set_index(['A', 'B','C'])
s = res.style
s = s.set_properties(
        **{'border': '1px black solid !important','font-size': '10pt'}).set_table_attributes(
        'style = "border-collapse:collapse"').set_table_styles([{
        'selector': '.col_heading',
        'props': 'background-color:black; font-size:9pt; color: white; border-collapse: collapse; border: 1px black solid !important;'
        }])
output = s.to_html("table.html",escape=False,index=False)

Вместо этого я хотел бы получить результат, как показано ниже. Хорошо то, что я всегда знаю, что нужно объединить только столбцы A и B.

обновление — образец ввода

df = pd.DataFrame({
    'Project_name': ['ABC', 'ABC', 'DEF', 'DEF', 'XYZ'],
    'Application': ['App1', 'App1', 'App2', 'App2', 'App3'],
    'Past_products': ['P1', 'P1', 'P2', 'P2', 'P3'],
    'Current_Product': ['C1', 'C2', 'C3', 'C4', 'C5'],
    'Recommendation_type': ['Type1', 'Type1', 'Type2', 'Type2', 'Type3'],
    'Rec_products': ['R1', 'R2', 'R3', 'R4', 'R5']
})
rowspan = "2" по пунктам A и B (при условии, что в остальных столбцах всегда есть 2 варианта)? - stackoverflow.com/questions/69403679/…
Paulie_D 26.06.2024 13:00

@Paulie_D Нет, двух не будет. Это может быть что угодно от 1 до 12.

The Great 26.06.2024 13:52

вы всегда можете создать собственную строку с помощью HTML и записать ее как обычный файл вместо использования .to_html()

furas 26.06.2024 14:13

может быть, нужно сбросить индекс - преобразовать его в обычные столбцы?

furas 26.06.2024 14:14

вот исходный код HTML-форматера в pandas. Вы можете попробовать прочитать его, чтобы увидеть, как он работает, или использовать его для создания собственного средства форматирования, которое будет добавлять индексы ожидаемым образом.

furas 26.06.2024 14:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете настроить его, переопределив исходную thehead , используя replace_with из beautifulsoup:

from bs4 import BeautifulSoup as BS, Tag

soup = BS(s.to_html(), "html.parser")

thead, tr = Tag(name = "thead"), Tag(name = "tr")
    
for _tr in soup.find("thead").find_all("tr")[::-1]:
    for tag in _tr.find_all("th"):
        if tag.text != "\xa0":  # ` :` pandas' placeholder
            tr.append(tag)
else:
    thead.append(tr)
    _ = soup.find("thead").replace_with(thead)

NB: Ваш Styler можно (или нужно?) упростить таким способом. А вот как сделать html файл.

Могу ли я узнать, как вы проверяете обновление определенных столбцов, а также их следует объединять только тогда, когда значения повторяются, верно? Что означает \xa0?

The Great 27.06.2024 03:40

Все есть в ответе, просто попробуйте ;)

Timeless 27.06.2024 07:35

Я получаю сообщение об ошибке, как показано ниже: AttributeError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_17156\3112311710.py in <cell line: 7>() 5 thead, tr = Tag(name = "thead"), Tag(name = "tr") 6 ----> 7 for _tr in soup.find("thead").find_all("tr")[::-1]: 8 for tag in _tr.find_all("th"): 9 if tag.text != "\xa0": # &nbsp;: pandas' placeholder AttributeError: 'NoneType' object has no attribute 'find_all' Может ли это быть потому, что один из моих неиндексных столбцов содержит None в качестве значения. Но None является допустимым значением для моих данных в реальном времени. может помочь?

The Great 30.06.2024 16:13

Если вы сможете обновить свой пример воспроизводимым, я буду рад помочь;)

Timeless 01.07.2024 11:37

Я предоставил обновленный образец ввода внизу моего сообщения. Несмотря на то, что я индексирую, используя три столбца — project_name, Application и past_products, он объединяет только первые два столбца, а past_products остается как есть. Я хочу, чтобы столбцы, которые я установил в качестве индекса, объединялись при наличии повторяющихся значений.

The Great 02.07.2024 05:47

Я не могу воспроизвести ошибку в обновленном примере. Возможно, это связано с тем, как вы используете код.

Timeless 02.07.2024 12:42

Другие вопросы по теме