如何用我自己的方法和函数扩展 pandas 的 Dataframe 类

Ben*_*Ben 4 python inheritance class dataframe pandas

第一个问题:

我正在使用 pandas 的 DataFrame,并且经常运行相同的例程作为数据预处理和其他操作的一部分。我想将其中一些例程编写为名为ExtendedDataframeextends 的类中的方法pandas.DataFrame。我不知道该怎么办。到目前为止,我没有__init__在新类中编写任何内容,因此它继承自pandas.DataFrame

import pandas
class ExtendedDataframe(pandas.DataFrame):
  def some_method(self):
    blahblah
Run Code Online (Sandbox Code Playgroud)

这显然使我能够通过继承创建一个实例ExtendedDataframe。但我通常通过类似pandas.read_csv返回经典DataFrame. 除了标准提供的方法之外,我怎样才能加载此类 csv 数据并在某个时候将其转换为ExtendedDataframe使用我自己的方法DataFrame?如果加载阶段返回一个标准DataFrame,然后我将其转换为ExtendedDataframe.

第二个问题:

并非我使用的所有 pandas 功能都是 DataFrame 方法。pandas.merge有些是以DataFrames 作为参数的函数,例如。如何将此类函数的使用扩展到我的ExtendedDataframe类的实例?换句话说,如果df1df2是 的两个实例ExtendedDataframe,我该如何制作

pandas.merge([df1, df2], ...)
Run Code Online (Sandbox Code Playgroud)

就像使用DataFrame?的标准实例一样工作

Gab*_*l A 8

这并不能直接回答您的问题,但它是您问题的潜在答案。很多人在他们的工作流程中使用管道方法。

https://pandas.pydata.org/pandas-docs/stable/ generated/pandas.DataFrame.pipe.html

而不是说

df = foo(df)
Run Code Online (Sandbox Code Playgroud)

你可以说

df = df.pipe(foo)
Run Code Online (Sandbox Code Playgroud)

您甚至可以为函数指定参数!这比尝试封装整个数据帧类更容易维护。所以我们的想法是,您可以创建一个函数库并根据需要对它们进行管道传输。

  • 您将遇到的问题是,一旦您调用内置方法,它就会返回一个普通的 DataFrame,而不是您的自定义 DataFrame。 (2认同)

s6h*_*ern 6

今天遇到了同样的问题,在同事的帮助下,我发现这是有效的:

import pandas as pd

class MyDF(pd.DataFrame):
    def __init__(self, *args, **kwargs):
        super(MyDF,  self).__init__(*args, **kwargs)

    @property
    def _constructor(self):
        return MyDF

    def my_custom_method(self):
        print('This actually works!')
Run Code Online (Sandbox Code Playgroud)

例子:

df = MyDF(columns=('a', 'b'))
df = df.append({'a': 1, 'b': 'test'})
print(df)
df.my_custom_method()  # prints "This actually works!"
Run Code Online (Sandbox Code Playgroud)