簡體   English   中英

派生的DataFrame類的方法鏈接

[英]Method chaining for derived DataFrame class

我正在嘗試通過以下代碼擴展pandas DataFrame

class CustomFrame(DataFrame):
    def __init__(self):
        DataFrame.__init__(self,{"a":[1,2,3,4],"b":[5,6,7,8]})
    def get(self):
        return self.loc[1]
    def foo(self):
        return 2*self

現在我想鏈接方法調用,例如:

>>> c=CustomFrame()
>>> c.get().foo()
'Series' object has no attribute 'foo'

顯然, .loc返回一個對自定義foo方法一無所知的Series。 有什么辦法可以使這項工作嗎?

編輯:

理想情況下,我想做類似的事情

c.method_from_data_frame().method_from_custom_frame().another_method_from_data_frame()

遵循HYRY的建議,我已經重寫了DataFrame的構造DataFrame ,但是我需要在DataFrame初始化上設置一些屬性

class CustomFrame(DataFrame):
    def __init__(self, *args, **kw):
        super(CustomFrame, self).__init__(*args, **kw)
        self.c = kw.get('c',False)

    @property
    def _constructor(self):
        return CustomFrame

   >>> c=CustomFrame(c=5)
   >>> print c.c
   5
   >>> print c.get().c
   False

我嘗試使用functools partial

    @property
    def _constructor(self):
        return partial(CustomFrame,c=5)

但是我得到了pandas.core.common.PandasError: DataFrame constructor not properly called! 錯誤。 另一種方法是改變get

    def get(self):
        ret =  self.loc[[1]] # CustomFrame with default .c
        ret.c = self.c
        return ret

看起來不是很優雅

您可以覆蓋_constructor屬性,這是一個示例,因為self.loc[1]返回一個系列對象,所以我將其更改為self.loc[[1]]

from pandas import DataFrame


class CustomFrame(DataFrame):
    def __init__(self, *args, **kw):
        super(CustomFrame, self).__init__(*args, **kw)

    @property
    def _constructor(self):
        return CustomFrame        

    def get(self):
        return self.loc[[1]]

    def foo(self):
        return 2*self

c=CustomFrame({"a":[1,2,3,4],"b":[5,6,7,8]})
print c.get().foo()

編輯

我沒有更好的主意來復制屬性,也許您可​​以使用_metadata或Decorator,這是帶有decorator的示例:

def copy_attrs(func):
    def wrap_func(self, *args, **kw):
        res = func(self, *args, **kw)
        res.c = self.c
        return res
    return wrap_func

class CustomFrame(DataFrame):
    def __init__(self, *args, **kw):
        self.__dict__["c"] = kw.pop("c", None)    
        super(CustomFrame, self).__init__(*args, **kw)

    @property
    def _constructor(self):
        return CustomFrame

    @copy_attrs
    def get(self):
       return self.loc[:2]

df = CustomFrame({"a":[1,2,3,4],"b":[5,6,7,8]}, c=100)
print df.c, df.get().c

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM