У меня есть фрейм данных 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 файлов.
Моя цель - сделать следующее
Проблема в том, что когда я пытаюсь индексировать столбцы (с целью объединения), макет выходит из строя и приводит к уродливому результату, как показано ниже.
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']
})
@Paulie_D Нет, двух не будет. Это может быть что угодно от 1 до 12.
вы всегда можете создать собственную строку с помощью HTML и записать ее как обычный файл вместо использования .to_html()
может быть, нужно сбросить индекс - преобразовать его в обычные столбцы?
вот исходный код HTML-форматера в pandas. Вы можете попробовать прочитать его, чтобы увидеть, как он работает, или использовать его для создания собственного средства форматирования, которое будет добавлять индексы ожидаемым образом.
Вы можете настроить его, переопределив исходную 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
?
Все есть в ответе, просто попробуйте ;)
Я получаю сообщение об ошибке, как показано ниже: 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": # : pandas' placeholder AttributeError: 'NoneType' object has no attribute 'find_all'
Может ли это быть потому, что один из моих неиндексных столбцов содержит None
в качестве значения. Но None является допустимым значением для моих данных в реальном времени. может помочь?
Если вы сможете обновить свой пример воспроизводимым, я буду рад помочь;)
Я предоставил обновленный образец ввода внизу моего сообщения. Несмотря на то, что я индексирую, используя три столбца — project_name
, Application
и past_products
, он объединяет только первые два столбца, а past_products
остается как есть. Я хочу, чтобы столбцы, которые я установил в качестве индекса, объединялись при наличии повторяющихся значений.
Я не могу воспроизвести ошибку в обновленном примере. Возможно, это связано с тем, как вы используете код.
rowspan = "2"
по пунктам A и B (при условии, что в остальных столбцах всегда есть 2 варианта)? - stackoverflow.com/questions/69403679/…