#pandas #sparse-matrix
#pandas #разреженная матрица
Вопрос:
pandas: 1.1.2
Как преобразовать dtype sparsearray в dtype float64?
df
id N_ERVisits N_admission N_diagnoses N_hospDays N_procedures
0 1 0.0 0.0 0.000090 0.0 0.000000
1 1 0.0 0.0 0.000000 0.0 0.000000
2 1 0.0 0.0 0.000000 0.0 0.000000
3 1 0.0 0.0 0.000800 0.0 0.000000
4 1 0.0 0.0 0.000000 0.0 0.000000
df.dtypes
id int64
N_ERVisits Sparse[float64, 0]
N_admission Sparse[float64, 0]
N_diagnoses Sparse[float64, 0]
N_hospDays Sparse[float64, 0]
N_procedures Sparse[float64, 0]
dtype: object
Я думал, что смогу выполнить стандартное преобразование:
df['N_ERVisits'] = df['N_ERVisits'].astype('float64')
df.dtypes
empi int64
N_ERVisits Sparse[float64, 0.0]
N_admission Sparse[float64, 0]
N_diagnoses Sparse[float64, 0]
N_hospDays Sparse[float64, 0]
N_procedures Sparse[float64, 0]
dtype: object
Ответ №1:
Если вам больше не нужна разреженность, используйте SparseArray.values.to_dense()
для преобразования ряда в плотный массив numpy. Затем .astype()
функция работает так, как ожидалось.
import pandas as pd
import numpy as np
# data
arr = np.zeros((100,))
arr[1] = 1
arr[10] = 10
df = pd.DataFrame(data={
'id': np.array(range(1, 101)),
'col1': pd.arrays.SparseArray(arr, fill_value=0)
})
# df["col1"].values.dtype == Sparse[float64, 0]
# sparsity retained (note the difference in fill_value)
df["col2"] = df["col1"].astype(pd.SparseDtype(np.float64))
df["col3"] = df["col1"].astype(np.float64)
# no sparsity
df["col4"] = df["col1"].values.to_dense().astype(np.float64)
print(df.dtypes)
Вывод:
id int64
col1 Sparse[float64, 0]
col2 Sparse[float64, nan]
col3 Sparse[float64, 0.0]
col4 float64
dtype: object
Кажущееся сложным явление можно понять с помощью базовых типов объектов столбца. Необходимо вызывать .values
явно, чтобы работать с самим базовым SparseArray
.
type(df["col1"])
Out[5]: pandas.core.series.Series
type(df["col1"].values)
Out[6]: pandas.core.arrays.sparse.array.SparseArray
Примечание. Моя версия pandas 1.0.3, но поведение должно быть идентичным.