Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Форматирование таблиц в Pandas. Учебно-методическое пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
61
'One': [1.2, 1.6, 1.5], 'Two': [2.9, 2.1, 2.5], 'Three': [3.1, 3.2, 3.8], }) dd.style.set_table_styles([{'selector': 'td', 'props': 'border: 2mm ridge rgba(211, 220, 50, .9)'}, {'selector': 'th', 'props': 'border: 5px inset olive'}], overwrite=False)
Для того же датафрейма применим стиль dotted для границ ячеек
с данными и стиль thick double – для границ, содержащих заголовки таблицы:
dd.style.set_table_styles([{'selector': 'td', 'props': 'border: 4px dotted green'}, {'selector': 'th', 'props': 'border: thick double red'}], overwrite=False)
Результат:
Применим стиль dashed для границ ячеек с данными и стиль
outset – для границ, содержащих заголовки таблицы:
dd.style.set_table_styles([{'selector': 'td', 'props': 'border: 4px dashed'}, {'selector': 'th', 'props': 'border: 3mm outset red'}], overwrite=False),
62
Получим:
Применим к данным стиль границы groove, а к заголовкам – me-
dium dashed:
dd.style.set_table_styles([{'selector': 'td', 'props': 'border: 6px groove aqua'}, {'selector': 'th', 'props': 'border: medium dashed red'}], overwrite=False)
Результат:
Псевдокласс :empty можно использовать для стилизации элемен-
тов, которые пусты. Создадим датафрейм с двумя отсутствующими эле­ментами и заключим в рамку ячейки, в которых нет данных:
import numpy as np import pandas as pd df2 = pd.DataFrame([[1, 2, 3,''], ['', 4, 5, 6]]) df2.style.set_table_styles([ {'selector': ':empty', 'props': 'border: 3px dashed red;'}, ], overwrite=False)
63
Результат:
Рассмотрим пример форматирования таблицы с иерархической
индексацией (MultiIndex). Создадим датафрейм, содержащий информа­цию о результатах итоговой аттестации студентов, обучающихся на бюджетной и внебюджетной основе, с помощью кода:
import pandas as pd df = pd.DataFrame([[25, 3, 21, 3], [22, 8, 22, 14], ], index=pd.Index(['Бюджет','Внебюджет'], name='Финансирование:'), columns=pd.MultiIndex.from_product([['Петров', 'Иванов'],['Сдали экзамен', 'Не сдали экзамен']], names=['Фамилия преподавателя:', 'Результаты:'])) df
Выполнив код, получили датафрейм:
Перед началом стилизации создадим из датафрейма объект Styler,
а также список словарей, каждый из которых будет содержать тег селек­тора CSS и свойства CSS. Свойства могут быть либо списком из двух кор­тежей, либо обычной CSS-строкой. В качестве свойств зададим следую­щие. При наведении курсора на данные предусмотрим закрашивание ячейки цветом лайм (lime). Сведения об этом будут содержаться в словаре cell_hover. Для элементов нулевого уровня датафрейма («Фамилия пре­подавателя», «Петров», «Иванов», «Финансирование», «Бюджет», «Вне­бюджет») с помощью словаря lev_0 зададим следующие свойства: стиль текста – курсив (italic), цвет текста – красный, его размер – 16 px, для начертания шрифта выберем значение 900 – жирный шрифт, выравнива­ние текста в ячейках сделаем по центру ячеек, для ячеек, содержащих
64
текст, зададим черную сплошную границу, толщина которой 1px. Для элементов первого уровня («Результаты», «Сдали экзамен», «Не сдали экзамен») предусмотрим другие начертание текста, его размер, цвет (словарь lev_1). Код этой части программы:
s=df.style cell_hover = { 'selector': 'td:hover', 'props': [('background-color', 'lime')] } lev_0 = { 'selector': '.level0', 'props': 'font-style: italic; color: red; \ font-weight:900; \ text-align: center; font-size: 16px;\ border: 1px solid black;', } lev_1={ 'selector': '.level1', 'props': 'font-style: italic; color: blue; \ font-weight:100; \ text-align: center; font-size: 14px; \ border: 1px solid black', }
После передачи созданных словарей в метод set_table_styles и вы-
полнения кода:
s.set_table_styles([cell_hover, lev_0, lev_1 ], overwrite=False) s.set_table_styles([{'selector': 'td', 'props': ' border: 2px dashed black; text-align: center;\ font-size: 14px; font-weight:600;' }], overwrite=False)
при наведении курсора на ячейку с данными получили:
65
Создадим еще два словаря со свойствами элементов таблицы.
В первом из них предусмотрим изменения в той части заголовков таб­лицы, которые не являются именами индексов (т. е. для всех, кроме пе­речисленных в параметрах namе и names при создании датафрейма: «Фи- нансирование», «Фамилия преподавателя», «Результаты»). Для этих за­головков изменим цвет текста с красного на белый и закрасим ячейки. С помощью второго словаря («неуспевающие») изменим цвет и тол­щину шрифта в столбцах «Не сдали экзамен». После выполнения кода:
headers = { 'selector': 'th:not(.index_name)', 'props': 'background-color: lch(33% 90 190); color: white;'} неуспевающие={'selector': 'th,td', 'props': 'color: red;font-weight:600',} s.set_table_styles([headers], overwrite=False) s.set_table_styles({ ('Петров', 'Не сдали экзамен'): [неуспевающие]},overwrite=False) s.set_table_styles({ ('Иванов', 'Не сдали экзамен'): [неуспевающие]}, overwrite=False)
получили:
3 . 4 . М е т о д ы a p p l y m a p , a p p l y , a p p l y m a p _ i n d e x
При работе с данными возникает необходимость применить ка-
кую-либо функцию к каждому элементу датафрейма. Для этого в Python существуют методы applymap и apply.
Синтаксис метода applymap:
Styler.applymap(func, subset=None, **kwargs) Параметры метода:
func – параметр, который должен принимать скаляр, а возвращать
строку с парой атрибут – значение CSS или None, если к элементу ука­занный стиль не применяется;
66
subset – метка, объект array-like или IndexSlice. Необязательный па-
раметр, предназначенный для выбора определенных строк и столбцов;
**kwargs – словарь параметров. Метод возвращает объект Styler. Например, можно создать функцию color_negative(), которая при
передаче ее в метод applymap закрашивает отрицательные значения данных датафрейма в заданный цвет:
import pandas as pd; import numpy as np def color_negative(v, background): return f"background: {background}" if v < 0 else None df = pd.DataFrame(np.random.randn(4, 2), columns=["A", "B"]) df.style.applymap(color_negative, background='lightgreen')
Результат:
Дважды применим к датафрейму df метод applymap. При первом
применении метода в качестве его параметра передадим функцию, кото­рая устанавливает для отрицательных чисел еще одно выходное свой­ство – смену цвета данных (props=' color: red; background: lightblue'), а при втором его применении – функцию, которая для значений, лежащих в ин­тервале от -0.3 до 0.3, уменьшает непрозрачность и меняет цвет данных:
def style_negative(v, props=''): return props if v < 0 else None s2 = df.style.applymap(style_negative,\ props='color:red; background: lightblue')\ .applymap(lambda v: 'opacity: 60%;color: purple' if (v < 0.3) and (v > -0.3) else None)
Результат:
67
С помощью метода applymap можно изменить и другие свойства
отдельных элементов таблицы, например их шрифт и размер:
import numpy as np; import pandas as pd; np.random.seed(0) df = pd.DataFrame(np.random.randn(5, 6)) def style_negative(v, props=''): return props if v < 0 else None s2 = df.style.applymap(style_negative,\ props='color:red; background: lightblue')\ .applymap(lambda v: 'font-weight: bold;\ color: green; font-size: 1.2em' if (v < 1) and (v > 0) else None) s2
Результат:
Чтобы применить CSS-стили к столбцам, строкам или ко всей
таблице, используют метод apply. Метод может применяться как к объ­екту DataFrame, так и к объектам Series. Синтаксис метода:
Styler.apply(func, axis=0, subset=None, **kwargs) Параметры метода:
func – функция, которая может принимать как объекты Series, так
и объекты DataFrame и возвращать объект типа списка (list-like) c CSS- стилями в виде строк 'атрибут: значение; атрибут2: значение2; ...' или в случае, когда к элементу не применяется указанный стиль, значение None или пустую строку (' ');
axis – ось. Указывает область применения: к каждому столбцу
(axis=0 или 'index'), к каждой строке (axis=1 или 'columns'), ко всему да­тафрейму сразу (axis=None);
subset – метка, объект array-like или IndexSlice. Необязательный па-
раметр, предназначенный для выбора определенных строк и столбцов.
Можно, например, изменить цвет данных нечетных столбцов,
а ячейки с данными в четных столбцах залить другим цветом:
68
import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(3, 4)) s = df.style.apply(lambda x: ['background: lightgreen' if i % 2 else 'color: red' for i in range(len(x))], axis=1) display(s)
Результат:
Так можно создать функцию, которая при передаче ее в метод
выделяет одним цветом максимальные элементы строк (или столбцов) и другим – остальные ячейки:
df.style.apply(lambda x: ["background:aqua;" if i == x.max() \ else "background:orange;" for i in x], axis=0) # axis=1 : строка и axis=0: столбец
Результат:
Создадим функцию mean_highlighter(), выходными аргументами
которой являются цвет текста в ячейке, его насыщенность и цвета за­краски ячеек в зависимости от того, является ли число в ячейке столбца больше среднего значения столбца данных (оливковый цвет ячейки) или меньше его (красный цвет закраски ячейки). Передадим эту функ­цию в метод apply и выполним код:
def mean_highlighter(x): style_lt = "background: red; color: white; font-weight: bold;" style_gt = "background: olive; color: white; font-weight: bold;" gt_mean = x > x.mean() return [style_gt if i else style_lt for i in gt_mean] df.style.apply(mean_highlighter)
69
Результат:
Применить функцию CSS-стиля можно и к индексам или заголов-
кам столбцов датафрейма. Для этого предназначен метод apply_index.
Синтаксис метода apply_index:
Styler.applymap_index(func, axis=0, level=None, **kwargs) Параметры метода:
func – функция. Должна принимать скаляр и возвращать массив
строк той же длины;
axis – ось. Заголовки, к которым применяется функция. Возмож-
ные значения: 0, 1, "индекс", "столбцы";
level – уровень. Необязательный параметр. Целое число, строка
или список. Если index имеет значение MultiIndex, то указывается уро­вень, к которому применяется функция.
Код для закрашивания всей строки, содержащей индексы:
def color_row(s): return "background-color: yellow;" df.style.applymap_index(color_row)
Результат:
Ячейку с индексом конкретной строки можно закрасить с помо-
щью следующего кода:
def color_row(s): return "background-color: yellow;" if s == 2 else None df.style.applymap_index(color_row)
70
Результат:
Для того чтобы закрасить ячейки, содержащие названия столб-
цов, нужно указать ось: df.style.applymap_index(color_row, axis=1).
3 . 5 . М е т о д p i p e
Метод pipe позволяет упростить применение нескольких пользо-
вательских функций для форматирования таблицы.
Синтаксис метода:
Styler.pipe(func, *args, **kwargs)
Параметры метода:
func – функция для применения к Styler; *args – аргументы, которые можно передать в функцию. Необя-
зательный параметр;
**kwargs – словарь аргументов ключевых слов, передаваемых
в func. Необязательный параметр.
С помощью этого метода пользователь может создавать функ-
ции, которые принимает объект стиля вместе с другими параметрами и возвращает измененный стиль. Можно, например, внутри функции func применить методы apply или set_properties.
Пример. Создадим датафрейм с данными о доле правильных от-
ветов по математике 10 учащихся и транспонируем его: в первой строке разместим номера учащихся, во второй – долю правильных ответов:
import pandas as pd import numpy as np df = pd.DataFrame({'number': list(range(1,11)), 'math_rating': [0.75, 0.85, np.nan,
0.6, 0.72, .9, .5, 0.7, 0.6, .56]}) t=df.T; t
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]