【问题标题】:Python Classes : How to add a custom method to an existing object (pandas dataframe)Python 类:如何将自定义方法添加到现有对象(熊猫数据框)
【发布时间】:2021-11-13 06:39:03
【问题描述】:

我想构建一个数据查看器,利用 EXCEL 来查看 pandas DataFrame 的内容。下面是一个简单的工作示例(作为函数)。但是,我不想将其称为view(df,10),而是将其称为df.view(10) 方法,类似于使用head 的方式,例如df.head(10)

我是 python classes 的新手。互联网上的所有示例都是定义一个新对象并为该新对象开发类。但我想我需要为现有的 pandas DataFrame 添加一个方法。我希望将此新方法存储在我自己的私有存储库中,然后我可以导入它,例如from brb import *,并能够在任意DataFrame 上使用它。

这可能吗?

import os
import numpy as np
import pandas as pd
import xlwings as xl


df = pd.DataFrame({
    'id': (1,2,3,4,5,6,7,8,9,10)*10,
    'year': tuple(np.arange(2011,2021))*10,
    'a': np.random.choice(range(2),100),
    'b': np.random.choice(range(100),100),
})


def view(df,NObs=None):
    book = xl.Book()
    book.sheets[0].range("A1").value = df[:NObs]


#  What I have:
view(df,10)   

#  What I want:
df.view(10)

【问题讨论】:

  • 你可以修改它。即pd.DataFrame.view = view,然后执行此行后创建的所有数据帧都可以用df.view(10) 调用。更简洁的解决方案是定义访问器对象 (pandas.pydata.org/docs/development/…),但如果您只是从类开始,我建议这太多了。
  • 谢谢!这个猴子修补的东西有效。一旦我了解了更多信息,我将在稍后研究更清洁的解决方案,但我很欣赏这个链接,因为它给了我一些可以继续下去的东西。我确实尝试支持您的评论,但已经搞砸了,现在不能。对于那个很抱歉。我很欣赏这个解决方案。

标签: python pandas dataframe class oop


【解决方案1】:

您可以像这样定义自己的类:

import numpy as np
import pandas as pd
import xlwings as xl


class MyDataFrame:
    def __init__(self, data):
        self.df = pd.DataFrame(data)

    def view(self, NObs=None):
        book = xl.Book()
        book.sheets[0].range("A1").value = self.df[:NObs]


if __name__ == "__main__":
    df = MyDataFrame(
        {
            "id": (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) * 10,
            "year": tuple(np.arange(2011, 2021)) * 10,
            "a": np.random.choice(range(2), 100),
            "b": np.random.choice(range(100), 100),
        }
    )
    df.view(10)

然后直接运行脚本或者在别处导入MyDataFrame

或者您甚至可以将自己的方法添加到 Pandas 对象并“本地”运行它,如下所示:

import numpy as np
import pandas as pd
import xlwings as xl
from pandas.core.base import PandasObject


def view(df, NObs=None):
    book = xl.Book()
    book.sheets[0].range("A1").value = df[:NObs]


PandasObject.view = view


if __name__ == "__main__":
    df = pd.DataFrame(
        {
            "id": (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) * 10,
            "year": tuple(np.arange(2011, 2021)) * 10,
            "a": np.random.choice(range(2), 100),
            "b": np.random.choice(range(100), 100),
        }
    )
    df.view(10)

【讨论】:

  • 谢谢。当我回到我的电脑时,我会试试这个。这是否允许我最终将它放入一个名为 say brb 的模块中,然后我会从 brb import * 执行,然后我可以使用 df.view() 吗?抱歉,对此还不够了解...
  • 其实。再次查看代码。我是否必须设置每个新数据框 df = MyDataFrame?因此,在我将其设置为等于 MyDataFrame 之前,是否无法在新的 pandas 数据帧上开箱即用?
  • 知道了,看我更新的答案。
  • 太完美了,非常感谢您的帮助。谢谢!
猜你喜欢
  • 2023-02-15
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 1970-01-01
  • 2023-04-03
  • 2023-02-01
相关资源
最近更新 更多