Визуализация таблиц#

Этот раздел демонстрирует визуализацию табличных данных с использованием Styler класс. Для получения информации о визуализации с помощью построения графиков см. Визуализация диаграмм. Этот документ написан в виде Jupyter Notebook и может быть просмотрен или загружен здесь.

Объект Styler и настройка отображения#

Стилизация и настройка отображения вывода должны выполняться после данные в DataFrame были обработаны. Styler - это не динамически обновляется, если в DataFrame вносятся дальнейшие изменения. DataFrame.style атрибут является свойством, возвращающим Styler объект. Он имеет _repr_html_ метод, определенный на нем, поэтому он автоматически отображается в Jupyter Notebook.

Styler, который можно использовать для больших данных, но в основном предназначен для малых данных, в настоящее время имеет возможность вывода в эти форматы:

  • HTML

  • LaTeX

  • Строка (и CSV по расширению)

  • Excel

  • (JSON в настоящее время недоступен)

Первые три из них имеют методы настройки отображения, предназначенные для форматирования и кастомизации вывода. К ним относятся:

  • Форматирование значений, индекса и заголовков столбцов с использованием .format() и .format_index(),

  • Переименование меток индекса или заголовков столбцов с использованием .relabel_index()

  • Скрытие определенных столбцов, индекса и/или заголовков столбцов, или имен индекса с использованием .hide()

  • Объединение похожих DataFrame с использованием .concat()

Форматирование отображения#

Форматирование значений#

The Styler различает отображение значение из фактический значение, как в данных, так и в заголовках индекса или столбцов. Чтобы управлять отображаемым значением, текст печатается в каждой ячейке как строка, и мы можем использовать .format() и .format_index() методы для манипулирования этим в соответствии с спецификатор формата строка или вызываемый объект, который принимает одно значение и возвращает строку. Это можно определить для всей таблицы, индекса, отдельных столбцов или уровней MultiIndex. Также можно перезаписать имена индексов.

Кроме того, функция format имеет точность аргумент для специального форматирования чисел с плавающей точкой, а также десятичный и тысячи разделители для поддержки других локалей, na_rep аргумент для отображения отсутствующих данных, и escape и гиперссылки аргументы для помощи в отображении безопасного HTML или безопасного LaTeX. Форматер по умолчанию настроен на использование глобальных настроек pandas, таких как styler.format.precision опция, управляемая с помощью with pd.option_context('format.precision', 2):

[2]:
import pandas as pd
import numpy as np
import matplotlib as mpl

df = pd.DataFrame({
    "strings": ["Adam", "Mike"],
    "ints": [1, 3],
    "floats": [1.123, 1000.23]
})
df.style \
  .format(precision=3, thousands=".", decimal=",") \
  .format_index(str.upper, axis=1) \
  .relabel_index(["row 1", "row 2"], axis=0)
[2]:
  СТРОКИ INTS FLOATS
строка 1 Адам 1 1,123
строка 2 Mike 3 1.000,230

Использование Styler для управления отображением — полезная функция, поскольку сохранение индексации и значений данных для других целей дает больший контроль. Вам не нужно перезаписывать ваш DataFrame, чтобы отобразить его так, как вам нравится. Вот более полный пример использования функций форматирования, при этом все еще полагаясь на базовые данные для индексации и вычислений.

[3]:
weather_df = pd.DataFrame(np.random.rand(10,2)*5,
                          index=pd.date_range(start="2021-01-01", periods=10),
                          columns=["Tokyo", "Beijing"])

def rain_condition(v):
    if v < 1.75:
        return "Dry"
    elif v < 2.75:
        return "Rain"
    return "Heavy Rain"

def make_pretty(styler):
    styler.set_caption("Weather Conditions")
    styler.format(rain_condition)
    styler.format_index(lambda v: v.strftime("%A"))
    styler.background_gradient(axis=None, vmin=1, vmax=5, cmap="YlGnBu")
    return styler

weather_df
[3]:
Токио Пекин
2021-01-01 2.539319 2.400233
2021-01-02 4.242790 2.364118
2021-01-03 2.970093 3.007211
2021-01-04 3.355701 0.735296
2021-01-05 3.265934 1.929888
2021-01-06 2.212551 3.449755
2021-01-07 2.223986 0.409007
2021-01-08 4.457208 1.331950
2021-01-09 4.577346 1.380128
2021-01-10 3.641450 4.648679
[4]:
weather_df.loc["2021-01-04":"2021-01-08"].style.pipe(make_pretty)
[4]:
Погодные условия
  Токио Пекин
Понедельник Сильный дождь Сухой
Вторник Сильный дождь Дождь
Среда Дождь Сильный дождь
Четверг Дождь Сухой
Пятница Сильный дождь Сухой

Скрытие данных#

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

Индекс может быть скрыт от отображения вызовом .hide() без аргументов, что может быть полезно, если ваш индекс основан на целых числах. Аналогично заголовки столбцов можно скрыть, вызвав .hide(axis="columns") без дополнительных аргументов.

Определенные строки или столбцы могут быть скрыты от отображения путем вызова того же .hide() метод и передача метки строки/столбца, списка или среза меток строк/столбцов для subset аргумент.

Скрытие не меняет целочисленное расположение CSS классов, например, скрытие первых двух столбцов DataFrame означает, что индексация классов столбцов все равно начнется с col2, поскольку col0 и col1 просто игнорируются.

[5]:
df = pd.DataFrame(np.random.randn(5, 5))
df.style \
  .hide(subset=[0, 2, 4], axis=0) \
  .hide(subset=[0, 2, 4], axis=1)
[5]:
  1 3
1 1.625023 -1.169797
3 -0.004225 0.371344

Чтобы инвертировать функцию в показать Для функциональности рекомендуется составлять список скрытых элементов.

[6]:
show = [0, 2, 4]
df.style \
  .hide([row for row in df.index if row not in show], axis=0) \
  .hide([col for col in df.columns if col not in show], axis=1)
[6]:
  0 2 4
0 -0.087432 -0.334898 -0.783397
2 -0.195797 0.872204 -1.548522
4 -0.197600 -0.201867 -1.044594

Объединение выходных данных DataFrame#

Два или более Styler могут быть объединены вместе при условии, что они используют одни и те же столбцы. Это очень полезно для отображения сводной статистики DataFrame и часто используется в сочетании с DataFrame.agg.

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

[7]:
summary_styler = df.agg(["sum", "mean"]).style \
                   .format(precision=3) \
                   .relabel_index(["Sum", "Average"])
df.style.format(precision=1).concat(summary_styler)
[7]:
  0 1 2 3 4
0 -0.1 -0.8 -0.3 -2.1 -0.8
1 -1.5 1.6 -0.5 -1.2 0.6
2 -0.2 -1.2 0.9 0.6 -1.5
3 1.3 -0.0 -1.2 0.4 0.5
4 -0.2 -0.1 -0.2 1.3 -1.0
Сумма -0.712 -0.498 -1.399 -1.086 -2.258
Среднее -0.142 -0.100 -0.280 -0.217 -0.452

Объект Styler и HTML#

The Styler изначально был создан для поддержки широкого спектра опций форматирования HTML. Его HTML-вывод создает HTML и использует язык стилей CSS для управления многими параметрами, включая цвета, шрифты, границы, фон и т.д. См. здесь для получения дополнительной информации о стилизации HTML-таблиц. Это обеспечивает большую гибкость из коробки и даже позволяет веб-разработчикам интегрировать DataFrames в свои существующие пользовательские интерфейсы.

Ниже мы демонстрируем вывод по умолчанию, который выглядит очень похоже на стандартное HTML-представление DataFrame. Но HTML здесь уже присоединил некоторые CSS-классы к каждой ячейке, даже если мы ещё не создали никаких стилей. Мы можем просмотреть их, вызвав .to_html() метод, который возвращает необработанный HTML в виде строки, что полезно для дальнейшей обработки или добавления в файл - подробнее в Подробнее о CSS и HTML. В этом разделе также будет представлено пошаговое руководство по преобразованию этого вывода по умолчанию для представления вывода DataFrame, который является более информативным. Например, как мы можем построить s:

[8]:
df = pd.DataFrame([[38.0, 2.0, 18.0, 22.0, 21, np.nan],[19, 439, 6, 452, 226,232]],
                  index=pd.Index(['Tumour (Positive)', 'Non-Tumour (Negative)'], name='Actual Label:'),
                  columns=pd.MultiIndex.from_product([['Decision Tree', 'Regression', 'Random'],['Tumour', 'Non-Tumour']], names=['Model:', 'Predicted:']))
df.style
[8]:
Модель: Дерево решений Регрессия Случайный
Предсказано: Опухоль Неопухолевый Опухоль Неопухолевый Опухоль Неопухолевый
Фактическая метка:            
Опухоль (Положительная) 38.000000 2.000000 18.000000 22.000000 21 nan
Нет опухоли (Отрицательный) 19.000000 439.000000 6.000000 452.000000 226 232.000000