如何在pandas的astype方法中使用自定义数据类型?
解决方案
你要的df.astype({'date':Quarter})调用形式需要遵循pandas的扩展类型规范实现自定义类型,也可以用更简洁的替代方案实现相同的转换效果,两种方案如下:
方案1:最简实现(无需修改自定义类,推荐优先用)
直接用map或apply方法映射自定义类到指定列即可,功能完全等价,代码量更少:
# 单列转换 df['date'] = df['date'].map(Quarter) # 多列批量转换(类似astype的字典传参写法) convert_map = {'date': Quarter, '其他列': 其他转换函数/类} for col, func in convert_map.items(): df[col] = df[col].map(func)
如果你的date列目前是字符串格式而非datetime格式,需要先转成datetime再映射:
df['date'] = pd.to_datetime(df['date']).map(Quarter)
方案2:实现pandas扩展类型,支持astype直接调用
如果一定要用astype的传参形式,需要按照pandas的扩展数据类型规范补充实现两个类,示例如下:
import pandas as pd from pandas.api.extensions import ExtensionDtype, ExtensionArray import numpy as np # 你原来的Quarter类 class Quarter: def __init__(self, date): self.year = date.year self.quarter = date.quarter def __repr__(self): return f'{self.year} Q{self.quarter}' # 1. 实现自定义Dtype类 class QuarterDtype(ExtensionDtype): type = Quarter kind = 'O' name = 'quarter' @classmethod def construct_from_string(cls, string): if string == 'quarter': return cls() raise TypeError(f"Cannot construct a '{cls.__name__}' from '{string}'") # 2. 实现扩展数组类 class QuarterArray(ExtensionArray): def __init__(self, values): self._values = np.asarray(values, dtype=object) @classmethod def _from_sequence(cls, scalars, dtype=None, copy=False): return cls(scalars) def __getitem__(self, key): return self._values[key] def __len__(self): return len(self._values) @property def dtype(self): return QuarterDtype() def isna(self): return np.array([x is None for x in self._values], dtype=bool) def take(self, indices, allow_fill=False, fill_value=None): from pandas.api.extensions import take result = take(self._values, indices, allow_fill=allow_fill, fill_value=fill_value) return QuarterArray(result) # 适配astype调用逻辑 def quarter_astype(self, dtype, copy=True): if isinstance(dtype, QuarterDtype) or dtype is Quarter: return QuarterArray([Quarter(x) for x in self]) return self.astype(dtype, copy=copy) pd.Series._astype = quarter_astype
实现完成后即可直接用你期望的写法调用:
df = df.astype({'date': Quarter})
内容的提问来源于stack exchange,提问作者MYK
相关产品推荐
相关产品推荐

