Appearance
5. Двумерные датасеты: pandas. DataFrame, создание и аудит структуры
Концепция pandas. DataFrame как матрицы признаков
Что такое pandas. DataFrame на физическом уровне
Если объект pandas.Series является аналогом одномерного вектора, то pandas.DataFrame — это полноценная двумерная таблица, которая служит фундаментальным представлением матрицы признаков в машинном обучении.
С точки зрения архитектуры, pandas.DataFrame устроен как упорядоченная коллекция отдельных столбцов pandas.Series, которые имеют общий индекс строк (shared index). Каждый столбец (признак) при этом имеет свою уникальную текстовую метку — название колонки (column name), и может обладать собственным типом данных (dtype). Это позволяет бесшовно объединять текст, целые числа и вероятности внутри одного объекта, не ломая структуру памяти.
Способы ручного конструирования таблиц
В ИИ-пайплайнах матрицы признаков конструируются тремя основными путями с помощью вызова конструктора pandas.DataFrame():
- Из словаря списков Python: Ключи словаря автоматически становятся названиями столбцов, а списки — данными.
- Из двумерного массива
numpy.ndarray: Позволяет мгновенно обернуть сырую математическую матрицу в удобный табличный формат, явно передав списки строк и колонок в параметрыindexиcolumns. - Из списка словарей: Каждая запись словаря интерпретируется как отдельный объект (строка) датасета.
python
import numpy
import pandas
# Method 1: Constructing a DataFrame from a standard Python dictionary
raw_data_dict = {
"feature_age": [25, 30, 35],
"feature_score": [0.95, 0.12, 0.44],
"target_class": [1, 0, 1]
}
dataset_table = pandas.DataFrame(raw_data_dict)
# Method 2: Wrapping a low-level 2D NumPy array matrix directly
numpy_matrix = numpy.ones((2, 3), dtype=numpy.float32)
matrix_table = pandas.DataFrame(
data=numpy_matrix,
columns=["metric_A", "metric_B", "metric_C"],
index=["sample_1", "sample_2"]
)
# Checking the structural metadata indices
print(dataset_table.shape) # Outputs geometry tuple: (3, 3) -> 3 rows, 3 columns
print(dataset_table.columns) # Outputs Columns Index: Index(['feature_age', 'feature_score', 'target_class'], dtype='object')
print(dataset_table.dtypes) # Outputs heterogeneous types per feature columnСоздание из набора Series, список списков и переименование осей
Помимо словаря и списка значений, таблицу можно собрать из отдельных именованных Series (значения словаря — сами одномерные контейнеры с индексами). Pandas автоматически выравнивает столбцы по индексным меткам: позиции, отсутствующие в соседнем столбце, заполняются маркерами NaN. Альтернативный путь — передача списка списков (строк) с явными параметрами index и columns. Готовые названия осей можно переопределить прямой записью в атрибуты .columns и .index.
python
import numpy
import pandas
# Method 3: Assembling a table from named Series objects with mismatched index bounds
velocity_series = pandas.Series([1.0, 2.0, 3.0], name="one")
mass_series = pandas.Series([1.0, 2.0, 3.0, 4.0], name="two")
aligned_table = pandas.DataFrame({"one": velocity_series, "two": mass_series})
print(aligned_table)
# Outputs (the extra index row of column "two" yields a NaN in column "one"):
# one two
# 0 1.0 1.0
# 1 2.0 2.0
# 2 3.0 3.0
# 3 NaN 4.0
# Method 4: Wrapping a plain list of rows with explicit axis labels
raw_rows = [[1.0, 1, 5], [2.0, 2, 6], [3.0, 3, 7], [numpy.nan, 4, 8]]
rows_table = pandas.DataFrame(
data=raw_rows,
index=["a", "b", "c", "d"],
columns=["one", "two", "three"]
)
# Renaming both axis metadata in one shot via direct attribute assignment
rows_table.columns = ["first_column", "second_column", "third_column"]
rows_table.index = [1, 2, 3, 4]
print(rows_table)
# Outputs the relabeled table:
# first_column second_column third_column
# 1 1.0 1 5
# 2 2.0 2 6
# 3 3.0 3 7
# 4 NaN 4 8Экспресс-аудит и оценка веса таблицы в памяти
При загрузке незнакомого датасета перед запуском Feature Engineering ИИ-инженер обязан провести первичную диагностику структуры данных с помощью встроенных инструментов аудита:
Методы быстрого просмотра .head() и .info()
dataframe.head(n)— выводит первыеnстрок таблицы (по умолчанию 5) в виде наглядной HTML-сетки. Позволяет визуально оценить характер данных.dataframe.info()— печатает сводную техническую информацию о датасете: общее количество строк, названия столбцов, количество заполненных значений (non-null) для поиска скрытых пропусков и типы данныхdtypes.
Математическое описание через метод .describe()
Метод dataframe.describe() мгновенно рассчитывает ключевые статистические показатели по всем числовым столбцам датасета: общее количество элементов (count), среднее арифметическое (mean), стандартное отклонение (std), экстремумы (min/max) и квантили (25%, 50%, 75%). Это критично для быстрого понимания масштаба и распределения признаков.
Оценка реального физического веса в RAM через .memory_usage()
Чтобы избежать падения пайплайна обучения по ошибке Out of Memory, необходимо жестко контролировать оперативную память. Метод dataframe.memory_usage(deep=True) возвращает точный вес в байтах, который занимает каждый отдельный столбец признаков. Параметр deep=True заставляет Pandas заглянуть внутрь текстовых строк на C-уровне, обеспечивая прецизионную оценку потребления RAM.
python
import pandas
raw_dict = {"text_feature": ["active", "inactive"], "numerical_feature": [1.5, 2.5]}
audit_df = pandas.DataFrame(raw_dict)
# Comprehensive engineering audit
print(audit_df.memory_usage(deep=True))Упражнения базовые (5 шт) (только с опорой на объясненную в данном уроке теорию)
1. Ручное создание датасета из словаря
Задача: Создайте объект pandas.DataFrame на основе словаря признаков: столбец "user_id" со значениями [101, 102], столбец "device_os" со значениями ["ios", "android"]. Выведите полученную таблицу на экран.
Посмотреть решение
python
import pandas
hardware_logs = {
"user_id": [101, 102],
"device_os": ["ios", "android"]
}
# Building a dataframe table using a standard dictionary structure
devices_df = pandas.DataFrame(hardware_logs)
print(devices_df)2. Обертывание 2D матрицы NumPy в DataFrame
Задача: Создайте единичную матрицу NumPy размером 3x2 через numpy.ones((3, 2)) с типом данных numpy.float32. Оберните её в pandas.DataFrame, принудительно назначив столбцам имена ["weight_1", "weight_2"]. Выведите метаданные .columns полученного объекта.
Посмотреть решение
python
import numpy
import pandas
raw_matrix = numpy.ones((3, 2), dtype=numpy.float32)
# Packing low-level matrix buffer specifying custom columns names strings
weights_df = pandas.DataFrame(data=raw_matrix, columns=["weight_1", "weight_2"])
print("Columns layout index description:", weights_df.columns)
print(weights_df.dtypes)3. Первичный вывод и экспресс-анализ геометрии
Задача: Создайте DataFrame из диапазона чисел, содержащий 10 строк и 2 столбца, с помощью словаря: {"A": range(10), "B": range(10, 20)}. Напечатайте первые 3 строки таблицы методом .head() и выведите кортеж общей формы .shape.
Посмотреть решение
python
import pandas
data_stream = {"A": range(10), "B": range(10, 20)}
stream_df = pandas.DataFrame(data_stream)
# Visualizing top rows and geometry properties
print(stream_df.head(3))
print("Total matrix shape coordinates:", stream_df.shape) # Outputs: (10, 2)4. Генерация базовых статистических показателей
Задача: Дан DataFrame metrics_df = pandas.DataFrame({"loss": [0.85, 0.42, 0.11], "accuracy": [0.55, 0.78, 0.92]}). Примените к нему метод .describe(), сохраните результат в переменную summary_statistics и выведите её на экран.
Посмотреть решение
python
import pandas
metrics_df = pandas.DataFrame({"loss": [0.85, 0.42, 0.11], "accuracy": [0.55, 0.78, 0.92]})
# Computing math_oge distribution summary statistics profiles per column
summary_statistics = metrics_df.describe()
print(summary_statistics)5. Побайтовый подсчет используемой памяти по столбцам
Задача: На основе объекта metrics_df из предыдущего упражнения вызовите метод глубокого подсчета используемой памяти .memory_usage(deep=True). Выведите результат в консоль.
Посмотреть решение
python
import pandas
metrics_df = pandas.DataFrame({"loss": [0.85, 0.42, 0.11], "accuracy": [0.55, 0.78, 0.92]})
# Extracting byte footprint data metrics directly from hardware stack
ram_consumption_bytes = metrics_df.memory_usage(deep=True)
print(ram_consumption_bytes)Упражнения смешанные (5 шт) (включают материал прошлых уроков)
6. Сборка DataFrame из сгенерированных векторов Series
Задача: Сгенерируйте один объект pandas.Series([25, 30, 18], name="age") и второй объект pandas.Series([0.9, 0.4, 0.1], name="score") (Урок 2 модуля Pandas). Объедините их в единый двумерный DataFrame, передав их в виде списка внутрь словаря: {"col_age": series_1, "col_score": series_2} (Урок 5 модуля Pandas). Выведите .shape полученной таблицы.
Посмотреть решение
python
import pandas
# Building independent named structural feature tracks (Lesson 2)
series_age = pandas.Series([25, 30, 18], name="age")
series_score = pandas.Series([0.9, 0.4, 0.1], name="score")
# Aggregating series references into a 2D matrix dataset (Lesson 5)
integrated_df = pandas.DataFrame({"col_age": series_age, "col_score": series_score})
print(integrated_df)
print("Resulting shape:", integrated_df.shape) # Outputs: (3, 2)7. Ранжирование значений столбца и вывод топ записей таблицы
Задача: Создайте DataFrame model_logs = pandas.DataFrame({"error": [1.42, 0.05, 0.89], "epoch": [1, 2, 3]}) (Урок 5 модуля Pandas). Извлеките из него отдельный изолированный столбец "error" (который является объектом Series) и отсортируйте его по значениям по возрастанию (Урок 4 модуля Pandas). Выведите результат сортировки.
Посмотреть решение
python
import pandas
model_logs = pandas.DataFrame({"error": [1.42, 0.05, 0.89], "epoch": [1, 2, 3]})
# Extracting column slice behaves as a standard Series object (Lesson 2 & Lesson 5)
error_series = model_logs["error"]
# Applying fast vector sorting algorithm (Lesson 4)
sorted_errors = error_series.sort_values()
print(sorted_errors)8. Оценка памяти DataFrame, собранного из квантованной матрицы NumPy
Задача: Сгенерируйте случайную или единичную низкоуровневую матрицу размером (100, 5) из нулей, принудительно задав квантованный целочисленный тип numpy.int8 (Урок 4 модуля NumPy). Оберните этот буфер в полноценный pandas.DataFrame (Урок 5 модуля Pandas). Выведите общий технический аудит структуры методом .info() и проверьте физический вес памяти в байтах через .memory_usage(deep=True).
Посмотреть решение
python
import numpy
import pandas
# Allocation of a hardware memory-optimized array buffer (NumPy Lesson 4)
low_level_matrix = numpy.zeros((100, 5), dtype=numpy.int8)
# Creating the 2D pandas table abstraction layer (Pandas Lesson 5)
quantized_df = pandas.DataFrame(low_level_matrix)
# Technical diagnostics audit
quantized_df.info()
print("\nBytes consumed per integer series column:\n", quantized_df.memory_usage(deep=True))9. Векторизованная математика над признаками DataFrame через NumPy ufuncs
Задача: Создайте таблицу логов активаций нейроneurons activations_table = pandas.DataFrame({"logits_A": [-1.0, 0.0], "logits_B": [2.0, -0.5]}) (Урок 5 модуля Pandas). Передайте этот двумерный объект целиком внутрь универсальной функции экспоненты numpy.exp() (Урок 8 модуля NumPy). Выведите итоговую таблицу вероятностей на экран и убедитесь, что ufuncs умеют обрабатывать целые датасеты Pandas.
Посмотреть решение
python
import numpy
import pandas
activations_table = pandas.DataFrame({"logits_A": [-1.0, 0.0], "logits_B": [2.0, -0.5]})
# NumPy complex universal ufuncs process multi-dimensional dataframes simultaneously on C-level
activated_probabilities_df = numpy.exp(activations_table)
print(activated_probabilities_df)10. Интроспекция свойств технического описания DataFrame в Jupyter
Задача: Напишите строку интерактивного запроса для выполнения в Jupyter Notebook, которая открывает подробное руководство Docstring по встроенному методу технического описания метаданных pandas.DataFrame.info с использованием символа интроспекции (Урок 1 модуля NumPy / Урок 1 модуля Pandas).
Посмотреть решение
python
import pandas
# The built-in help call opens the DataFrame.info documentation in the pager
help(pandas.DataFrame.info)