【问题标题】:Using iloc and loc from pandas in own class在自己的类中使用来自 pandas 的 iloc 和 loc
【发布时间】:2021-11-23 18:10:42
【问题描述】:

我想创建一个自己的类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() 的方法,因为我无法使用[] 轻松访问它。

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

【问题讨论】:

    标签: python pandas inheritance methods


    【解决方案1】:

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

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

    要返回相同类型的对象,也许可以使用一个帮助类来包装对__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]
    

    【讨论】:

    • 感谢您的回答。但是如果我这样做,我只会得到 DataFrame 而不是带有 DataFrame whitin 的 ExampleClass 对象......
    • 啊,对,看我的编辑
    猜你喜欢
    • 2016-10-21
    • 1970-01-01
    • 2018-02-20
    • 2021-08-29
    • 2015-04-29
    • 2019-05-26
    • 1970-01-01
    • 2020-06-25
    • 2019-03-03
    相关资源
    最近更新 更多