Pandas DataFrame 对象继承还是对象使用?

9 投票
2 回答
4685 浏览
提问于 2025-04-18 11:41

我正在建立一个库,用来处理一些特定结构的数据,并且我的基础设施是基于Pandas的。目前,我正在为不同的使用场景编写各种数据容器,比如CTMatrix,用于存储国家和时间的数据,以便为所有国家和时间结构的数据提供合适的方法。

我现在在考虑两种选择:

选项1:对象继承

class CTMatrix(pd.DataFrame):
    methods etc. here

或者 选项2:对象使用

class CTMatrix(object):
    _data = pd.DataFrame

    then use getter, setter methods to control access to _data etc. 

从软件工程的角度来看,这里有没有明显的选择?

到目前为止,我的想法是:

选项1:

  1. 可以直接在CTMatrix类上使用DataFrame的方法(比如 CTmatrix.sort()),而不需要通过选项2中的封装对象 _data 来支持这些方法。
  2. Pandas中的更新和新方法会被继承,除了那些可能会被本地类方法覆盖的方法。

但是

  1. 一些方法会比较复杂,比如 __init__(),需要把属性传递给父类 super(MyDF, self).__init__(*args, **kw)

选项2:

  1. 对类及其行为有更多的控制。
  2. 可能对Pandas的更新更具韧性?

但是

  1. 需要使用getter()或者非隐藏属性来像使用DataFrame那样使用对象,比如 (CTMatrix.data.sort())。

选择选项1还有其他缺点吗?

2 个回答

1

因为遇到了一些类似的问题,还有Matti John的回答,我为我的一个项目写了一个 _pandas_wrapper 类,因为我也想从pandas的DataFrame继承。

https://github.com/mcocdawc/chemcoord/blob/bdfc186f54926ef356d0b4830959c51bb92d5583/src/chemcoord/_generic_classes/_pandas_wrapper.py

这个类的唯一目的是提供一个看起来像pandas DataFrame的东西,但它是安全的,可以被继承。

如果你的项目是LGPL许可证的,你可以毫无问题地重复使用它。

5

我建议不要去继承 DataFrame,因为很多 DataFrame 的方法会返回一个新的 DataFrame,而不是你自己定义的 CTMatrix 对象。

在GitHub上有一些相关的问题,比如:

更一般来说,这涉及到组合和继承的问题。我特别要提醒你注意第二个好处。现在看起来可能很不错,但如果你不时刻关注Pandas的更新(而且它更新得很快),你可能会遇到意想不到的问题,导致你的代码和Pandas紧密纠缠在一起。

撰写回答