[英]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.