Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Форматирование таблиц в Pandas. Учебно-методическое пособие
.pdf
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
