在自己的 class 中使用来自 pandas 的 iloc 和 loc

Using iloc and loc from pandas in own class

我想制作一个自己的 class ExampleClass,将数据存储在 pandas DataFrame 中。我这样做是为了创建我自己的方法来操作数据。

我的问题是: 是否可以使用 ExampleClass 的对象,例如:

import pandas as pd

class ExampleClass:
    def __init__(self, data: pd.DataFrame):
        self.data = data
        self.other_value = 42

obj = ExampleClass(pd.DataFrame([1,2,3]))
part_of_obj = obj.iloc[:2]

其中 type(part_of_obj) == ExampleClasspart_of_obj.data == obj.data.iloc[:2]?

所以我想要 obj 的副本,但带有 obj.data.iloc[:2] .

我不想使用 __getitem__,因为那时我将绑定到 iloc 或 loc,不能同时使用两者。而且我不想创建一个名为 iloc() 的自己的方法,因为我无法使用 [].

轻松访问它

也许我可以通过继承实现它,但我已经编写了我的 class 并且它使用 DataFrame 来操作数据,这使得更改所写的所有内容变得非常困难。

您可以通过 属性 公开 iloc 然后您还可以添加 loc 以相同的方式对数据框进行子集化。

@property
def iloc(self):
  return self.data.iloc

到return一个相同类型的对象也许可以使用一个助手class来包装对__getitem__的调用:

class ExampleClass:
  class Subsetter:
    def __init__(self, locator):
      self.locator = locator

    def __getitem__(self, *vargs, **kwargs):
      return ExampleClass(self.locator.__getitem__(*vargs, **kwargs))

  def __init__(self, data: pd.DataFrame):
      self.data = data
      self.other_value = 42

  @property
  def iloc(self):
    return self.Subsetter(self.data.iloc)

obj = ExampleClass(pd.DataFrame([1,2,3]))
part_of_obj = obj.iloc[:2]