我正在尝试将 pd.DataFrame 中的多个列从密集型转换为稀疏型。以下 MRE(密集整数到稀疏整数)有效:
>>> dense = pd.DataFrame({"A": [1, 0, 0, 1]})
>>> dtype = pd.SparseDtype(int, fill_value=0)
>>> sparse = dense.astype(dtype)
>>> print(sparse.dtypes)
A Sparse[int32, 0]
dtype: object
但是,将此逻辑扩展到稀疏日期时间数据失败:
>>> dense = pd.DataFrame({"A": pd.to_datetime(['2021-01-01', pd.NaT, pd.NaT])})
>>> dtype = pd.SparseDtype('datetime64')
>>> sparse = dense.astype(dtype)
>>> print(sparse.dtypes)
返回断言错误“assert values.tx is None and aware”
我正在使用 pandas 1.3.5.
此代码创建一个带有日期时间值的 pandas DataFrame,然后使用 SparseDtype 对象将其转换为稀疏 pandas DataFrame。生成的稀疏 DataFrame 包含相同的日期时间值,缺失值表示为 nan。
import pandas as pd
dense = pd.DataFrame({"A": pd.to_datetime(['2021-01-01', pd.NaT, pd.NaT])})
dtype = pd.SparseDtype('datetime64[ns]')
sparse = dense.astype(dtype)
print(sparse.dtypes)
我开始升级
pandas
pip install --upgrade pandas
然后您需要为 SparseDtype 提供一个
fill_value
,因为默认情况下,SparseDtype 的fill_value
设置为None
,这不是datetime64
数据的有效填充值。
import pandas as pd
dense = pd.DataFrame({"A": pd.to_datetime(['2021-01-01', pd.NaT, pd.NaT])})
dtype = pd.SparseDtype('datetime64[ns]', fill_value=pd.NaT)
sparse = dense.astype(dtype)
print(sparse.dtypes)
这对我有用!