Skip to content

5. Двумерные датасеты: pandas. DataFrame, создание и аудит структуры ​

Концепция pandas. DataFrame как матрицы признаков ​

Что такое pandas. DataFrame на физическом уровне ​

Если объект pandas.Series является аналогом одномерного вектора, то pandas.DataFrame — это полноценная двумерная таблица, которая служит фундаментальным представлением матрицы признаков в машинном обучении.

С точки зрения архитектуры, pandas.DataFrame устроен как упорядоченная коллекция отдельных столбцов pandas.Series, которые имеют общий индекс строк (shared index). Каждый столбец (признак) при этом имеет свою уникальную текстовую метку — название колонки (column name), и может обладать собственным типом данных (dtype). Это позволяет бесшовно объединять текст, целые числа и вероятности внутри одного объекта, не ломая структуру памяти.

Способы ручного конструирования таблиц ​

В ИИ-пайплайнах матрицы признаков конструируются тремя основными путями с помощью вызова конструктора pandas.DataFrame():

  1. Из словаря списков Python: Ключи словаря автоматически становятся названиями столбцов, а списки — данными.
  2. Из двумерного массива numpy.ndarray: Позволяет мгновенно обернуть сырую математическую матрицу в удобный табличный формат, явно передав списки строк и колонок в параметры index и columns.
  3. Из списка словарей: Каждая запись словаря интерпретируется как отдельный объект (строка) датасета.
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)