Преобразование кадра данных 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.
Статьи по теме, которые вам также могут понравиться