【问题标题】:Pythonic way of extending base class扩展基类的 Pythonic 方式
【发布时间】:2013-07-17 23:20:36
【问题描述】:

我正在尝试使用一些添加的构造函数创建一个类似于 pandas Dataframe 的类:

class ExtendedDataFrame(DataFrame):
    def __init__(self):
        super(ExtendedDataFrame, self).__init__()   # without this I get a pandas error

    @classmethod    
    def contructor1(cls, filename):
        "Create DataFrame from file"
        df = pd.read_csv(filename) # returns a DataFrame
        df.__class__ = cls
        return df

    # more methods extending Dataframe ...

所以现在我可以做到:

ExtendedDataFrame.constructor1('table_xx.txt')    # returns an ExtendedDataFrame instance

我希望能够以这种方式获取我的 Table 类的实例:

ExtendedDataFrame('table_xx.txt')

推荐的方法是什么?

换句话说,我正在尝试创建一个 ExtendedDataFrame 类,但一些 pandas 的方法(如 read_csv)返回一个 DataFrame,我希望返回一个 ExtendedDataFrame

【问题讨论】:

  • 您到底想达到什么目的?为什么不直接说Table = pd.read_csv 并使用它呢?
  • 我计划根据构建时传递的参数(文件名类型)使用 pd.read_csv 或 pd.read_fwf,我还计划用其他方法扩展类。
  • 如果只是文件名区分,请在外部执行此操作或定义一个返回数据帧的简单函数。除了区分输入数据格式之外,您还需要 Table 类做什么?
  • 那么你有两件事:1) 使用新的 DataFrame-y 方法扩展 DataFrame,以及 2) 预填充 DataFrame 的工厂函数......嗯......我不会不要对调用Table() 如此挂心......只要有一个聪明的DataFrame.smart_load() 并让它在内部调用私有方法来加载数据,而不是搞乱__init__ 以及以后在获取DataFrame 时可能发生的任何混淆和你的扩展 DataFrame 一起很好地交互......
  • 查看this github issue,过去有一些关于对数据帧进行子类化等的讨论,希望将来会更容易。

标签: python class pandas


【解决方案1】:

__init__ 方法中使用参数扩展,调查提供的参数,如果找到一个字符串参数,则在内部执行 Table.constructor1('string')

另一方面,仔细研究您的问题,我想知道您想在这里实现什么。到目前为止,您的 constructor1 类方法没有意义。你想实现什么样的功能,以至于df = pd.read_csv(...) 对你来说还不够?

【讨论】:

  • 你能澄清一下'在内部执行 Table.constructor1('string')' 吗?
  • 这只是一个例子,在实践中我计划根据传递给构造函数的参数使用 read_csv 或 read_fwf,并添加一些针对我的问题的方法
  • 在类的 init 方法中,即在类的内部,因此它不是接口的一部分。
  • @Jan-PhilipGehrcke 我想知道这是否只是归结为read_csv 将返回DataFrame 而OP 希望它返回ExtendedDataFrame...跨度>
  • @JonClements,这正是我想要的,显然我不够清楚。
猜你喜欢
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多