【问题标题】:Use read_csv from pandas to create an instance of a child class of pandas.DataFrame in Python使用 pandas 中的 read_csv 在 Python 中创建 pandas.DataFrame 子类的实例
【发布时间】:2021-11-02 19:23:19
【问题描述】:

我正在通过继承向pandas.DataFrame 添加一些功能:

import pandas as pd
class my_class(pd.DataFrame):
    def __init__(self, *args):
        super().__init__(*args)
    def my_func(self):
        print('New function!')

但我还是想使用pandas.read_csv 来加载数据框。我在这里检查过,似乎不鼓励将pandas.DataFrame 实例的__class__ 简单地更改为my_class。有一个更好的方法吗?谢谢!


对于上面引用的类,我可以使用pandas.DataFrame.__init__中的data参数将pandas.read_csv的结果传入,但是如果该参数不可用我该怎么办?

【问题讨论】:

  • 顺便说一句,super().__init__(*args) 没有那么多余
  • read_csvpd.read_csv 所谓的模块方法,将classmethod/static 添加到您的自定义类中......或者我错过了smt? [链接不可点击]并且super().__init__(self, *args)中的self仍然是多余的
  • @cards 我正在尝试创建一个行为类似于pd.read_csv 但返回my_class 的实例的函数,它是pd.DataFrame 的子类。本质上是强制转换,但在 Python 中似乎不受欢迎(或者我可能错了)。
  • 我个人会将函数作为 smt 独立于实例(这也是为什么它是模块函数而不是 DataFrame 的一部分),以便作为类/静态方法......甚至作为外部函数。尝试用您认为应该是的内容来编辑问题......(“表现得像”很模棱两可!)

标签: python pandas dataframe oop inheritance


【解决方案1】:

在您的类声明中,您缺少 def __new__(cls,...) dunder 方法来初始化实例。这应该有效:

import pandas as pd
class my_class(pd.DataFrame):
    def __new__(cls, *args, **kwargs):
        return super().__new__(cls)
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def my_func(self):
        print('New function!')

不确定,这就是它所要求的,但如果您创建自己的pandas.DataFrame,您可以通过在读取后对其进行初始化来将新的“read_csv(file)”读取数据帧“转换”为自定义数据帧。所以有了上面的声明,这行得通:

my_class({'test_col': [1,2,3]}).to_csv('test_my_class.csv')

df = pd.read_csv('test_my_class.csv')

my_class(df)

【讨论】:

  • __new__ 中的 *args 和 **kwargs 发生了什么?它们没有在您的代码中使用......并且使 {'test_col': [1,2,3]} 完全没用
  • @cards 我对此并不完全确定,但我猜它们会传递给__init__,因为如果有__new__,它会首先执行并触发__init__。如果你运行my_class({'test_col': [1,2,3]}),它会返回一个my_class风格的DataFrame。
  • 我的错,它有效,但不知道为什么;)
  • 让我困惑的是{'test_col': [1,2,3]}__init__处理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多