Преобразование кадра данных pandas в массив NumPy

Введение

При работе с pandas DataFrames иногда может быть полезно преобразовать их в массивы NumPy. Последнее кажется более эффективным с точки зрения памяти, особенно когда речь идет о выполнении некоторых сложных математических операций над данными.

Это особенно актуально, когда вы работаете с относительно небольшими объемами данных (скажем, 50 тысяч строк или меньше). Pandas обычно превосходит ndarray в случаях, когда требуется значительно больший объем данных (скажем, >500 тыс. строк). Это просто эмпирическое правило — в большинстве случаев было бы лучше протестировать оба варианта и посмотреть, какой из них лучше с точки зрения производительности и использования памяти, исходя из ваших конкретных требований и вариантов использования.

В сегодняшнем кратком руководстве мы покажем, как эффективно преобразовать DataFrame pandas в массив NumPy.

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

import pandas as pd

df = pd.DataFrame(
    [
        (1, 'A', 10.5, True),
        (2, 'B', 10.0, False),
        (3, 'A', 19.2, False),
        (4, 'C', 21.1, True),
        (5, 'A', 15.5, True),
        (6, 'C', 14.9, False),
        (7, 'C', 13.1, True),
        (8, 'B', 12.5, False),
        (9, 'C', 11.2, False),
        (10, 'A', 31.4, False),
        (11, 'D', 10.4, True),
    ],
    columns=['colA', 'colB', 'colC', 'colD']
)
print(df)
    colA colB  colC   colD
0      1    A  10.5   True
1      2    B  10.0  False
2      3    A  19.2  False
3      4    C  21.1   True
4      5    A  15.5   True
5      6    C  14.9  False
6      7    C  13.1   True
7      8    B  12.5  False
8      9    C  11.2  False
9     10    A  31.4  False
10    11    D  10.4   True

Использование pandas.DataFrame.to_numpy()

Первый вариант, который у нас есть, когда дело доходит до преобразования pandas DataFrame в массив NumPy, — это метод pandas.DataFrame.to_numpy().

ndarray = df.to_numpy()
print(ndarray)
array([[1, 'A', 10.5, True],
       [2, 'B', 10.0, False],
       [3, 'A', 19.2, False],
       [4, 'C', 21.1, True],
       [5, 'A', 15.5, True],
       [6, 'C', 14.9, False],
       [7, 'C', 13.1, True],
       [8, 'B', 12.5, False],
       [9, 'C', 11.2, False],
       [10, 'A', 31.4, False],
       [11, 'D', 10.4, True]], dtype=object)

И тип возвращаемого объекта будет numpy.ndarray:

>>> type(ndarray)
<class 'numpy.ndarray'>

Использование pandas.DatFrame.to_records()

Другим вариантом здесь является метод pandas.DataFrame.to_records(), который преобразует DataFrame pandas в массив записей NumPy:

recarray = df.to_records()
print(recarray)
rec.array([( 0,  1, 'A', 10.5,  True), 
           ( 1,  2, 'B', 10. , False),
           ( 2,  3, 'A', 19.2, False), 
           ( 3,  4, 'C', 21.1,  True),
           ( 4,  5, 'A', 15.5,  True), 
           ( 5,  6, 'C', 14.9, False),
           ( 6,  7, 'C', 13.1,  True), 
           ( 7,  8, 'B', 12.5, False),
           ( 8,  9, 'C', 11.2, False), 
           ( 9, 10, 'A', 31.4, False),
           (10, 11, 'D', 10.4,  True)],
          dtype=[('index', '<i8'), ('colA', '<i8'), ('colB', 'O'), ('colC', '<f8'), ('colD', '?')])

Как уже упоминалось, в отличие от to_numpy(), метод to_records() вернет объект типа nympy.recarray:

>>> type(recarray)
<class 'numpy.recarray'>

Использование numpy.asarray()

Третий вариант, который у нас есть, — это метод numpy.asarray(), который преобразует входные данные pandas DataFrame в массив NumPy:

import numpy as np
ndarray = np.asarray(df)
print(ndarray)
array([[1, 'A', 10.5, True],
      [2, 'B', 10.0, False],
      [3, 'A', 19.2, False],
      [4, 'C', 21.1, True],
      [5, 'A', 15.5, True], 
      [6, 'C', 14.9, False],
      [7, 'C', 13.1, True],
      [8, 'B', 12.5, False],
      [9, 'C', 11.2, False],
      [10, 'A', 31.4, False],
      [11, 'D', 10.4, True]], dtype=object)

Возвращаемый объект снова будет экземпляром numpy.ndarray:

>>> type(ndarray)
<class 'numpy.ndarray'>

Избегайте использования df.values

В более старых версиях pandas другим способом преобразования кадра данных pandas в массив NumPy было использование свойства pandas.DataFrame.values. Однако обратите внимание, что даже официальная документация призывает вас больше не использовать его:

Вместо этого мы рекомендуем использовать DataFrame.to_numpy().

Это связано с тем, что поведение этого свойства непоследовательно. Чтобы узнать подробности, вы можете прочитать примечания к выпуску версии 0.24.0.

Исторически это было бы сделано с series.values, но с .values было неясно, будет ли возвращаемое значение фактическим массивом, некоторым его преобразованием или одним из пользовательских массивов панд (например, Categorical).

Последние мысли

В сегодняшней статье мы обсудили преобразование pandas DataFrames в массивы NumPy и при каких обстоятельствах это может быть полезно.

Кроме того, мы продемонстрировали, как преобразовать DataFrame в ndarray, используя методы to_numpy() и to_records() объекта pandas.DataFrame, а также метод numpy.asarray().

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



Статьи по теме, которые вам также могут понравиться