不是一个确定的答案。
更好地描述您想要实现的目标将有助于解决问题。
随时更新您的帖子以符合堆栈标准。
出血边缘可能会破坏功能
您引用的第一个通知对象是相当新的,可能会在您的流程中引入重大变化:
pandas.api.extensions.ExtensionDtype 和
pandas.api.extensions.ExtensionArray API 是新的和实验性的。
它们可能会在版本之间更改而不会发出警告。
跟上潮流总是好的。但也许您的主动方法要求比pandas 目前的要求更高。
深入了解pandas 来源
注意比pandas 严重依赖python对象模型和自省,它也执行了很多替换。
import inspect
import pandas as pd
pd.__version__ # 1.3.5
例如,找到read_csv 的来源并不简单:
inspect.getsourcefile(pd.read_csv)
# ./pandas/util/_decorators.py
这很不走运,但仍然可以找到来源:
inspect.getsource(pd.read_csv)
这就解释了为什么我们被路由到_decorator.py:
@deprecate_nonkeyword_arguments(
version=None, allowed_args=["filepath_or_buffer"], stacklevel=3
)
# ...
def read_csv(
filepath_or_buffer: FilePathOrBuffer,
# ...
return _read(filepath_or_buffer, kwds)
稍作搜索,您可能会在GitHub 上找到该文件。
检查未来的Extension 对象
阅读ExtensionDtype和ExtensionArray的源码,暴露了具体的转换方法。
正如@sneakers-the-rat 所发现的,ExtensionArray 中有一个 _formatter 方法,一旦我们知道您的目标是什么,这可能是一个很好的尝试。
探索to_csv 堆栈
这种方法更容易找到,但它有很多间接级别。您可以探索它here。关键是它返回一个DataFrameRenderer 对象:
@final
@doc(storage_options=_shared_docs["storage_options"])
def to_csv(
self,
path_or_buf: FilePathOrBuffer[AnyStr] | None = None,
# ...
):
# ...
return DataFrameRenderer(formatter).to_csv(
# ...
)
它被定义为here,并且还使用了CSVFormatter 定义的here 对象。
这个最终对象包含将DataFrame 转换为 CSV 文件的整个逻辑。但它没有明确使用:
-
ExtensionDtype 或 ExtensionArray 对象或对象方法;
- 字符串转换使用
str或repr或相关魔术方法__str__和__repr__方法。
中间结论
这不是详尽的搜索,也不是证明它不可行的证据,但这在很大程度上取决于您想要实现的目标。更精确的定义将有助于找到解决方案。
此答案基于撰写本文时的最新版本 (1.3.5)。 Pandas 框架发展迅速。
使用自己的框架扩展 pandas 无疑是个好主意。无论如何,目前看来您将不得不等待:
- 扩展对象以公开导出功能以及导入;
- 要在导出流程中映射的转换功能。