Никаких внешних библиотек не требуется

Разработчики часто выбирают Python для написания преобразований данных. Благодаря обширной экосистеме сторонних пакетов функциональность может быть быстро интегрирована.

При работе с большими данными библиотеки типа pandas, PySpark, NumPy, TensorFlow и PyTorch позволяют быстро манипулировать и преобразовывать данные.

Но что, если у вас есть небольшие данные, пара сотен записей или даже тысяча. Вам нужно использовать внешние библиотеки?

Не всегда в Python есть простые встроенные методы, помогающие преобразовывать данные.

Составить список

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

Без понимания списков, допустим, вы хотите сгенерировать структуру данных пять строк на пять столбцов, вам нужно будет использовать for циклы следующим образом.

Это шесть строк кода, неплохо. Что, если бы вы могли сделать то же самое в одну строчку?

[[randint(0, 10) for y in range(5)] for x in range(5)]

Вышеупомянутая строка намного более лаконична и избавляет от необходимости собирать и добавлять элементы в список. На самом деле это два понимания списка:

# Collects rows
[<row> for x in range(5)]
# Builds each row
[randint(0, 10) for y in range(5)]

Фильтрация данных

Приведенный выше код является примером преобразования данных. Он преобразовал два оператора диапазона в матрицу данных 5x5. Понимания списков также могут использовать условные выражения для дальнейшего преобразования данных.

# Select columns 0, 1, 3
[[column for x, column in enumerate(row) if x in (0, 1, 3)] for row in data]

Вышеупомянутая строка выбирает 0-й, 1-й и 3-й столбцы из каждой строки и строит новую матрицу. Опять же, это на самом деле два списка.

# Row iterator
[<row> for row in data]
# Transforms row
[[column for x, column in enumerate(row) if x in (0, 1, 3)]

Толкование словаря

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

# Assumes all rows have the same number of columns
columns = {i: [row[i] for row in data] for i in range(len(data[0]))}

В этом примере выполняется итерация по списку, как в предыдущих примерах, но добавляется новый поворот. Вместо одного выражения каждая итерация создает пару "ключ-значение".

Запуск примера

Ниже приводится полный пример обсуждаемой функциональности.

В результате будет получен следующий результат:

Row view:
[[1, 2, 4, 7, 8],
 [1, 0, 0, 5, 2],
 [0, 0, 2, 3, 12],
 [1, 0, 0, 5, 14],
 [1, 1, 1, 7, 3]]
Column view:
{0: [1, 1, 0, 1, 1],
 1: [2, 0, 0, 0, 1],
 2: [4, 0, 2, 0, 1],
 3: [7, 5, 3, 5, 7],
 4: [8, 2, 12, 14, 3]}
Stats:
Column 0, min=0.00, max=1.00, mean=0.80, stdev=0.45
Column 1, min=0.00, max=2.00, mean=0.60, stdev=0.89
Column 2, min=0.00, max=4.00, mean=1.40, stdev=1.67
Column 3, min=3.00, max=7.00, mean=5.40, stdev=1.67
Column 4, min=2.00, max=14.00, mean=7.80, stdev=5.31

Заключение

Python уже многое встроил в язык.

Все обсуждаемые функции определенно упрощаются с помощью таких библиотек, как pandas и NumPy. Но это не всегда необходимо, если у вас небольшой проект и / или вы хотите ограничить сторонние зависимости.

Использование чистого Python - неплохой вариант.