继承还是不继承?
关于Pandas子类问题的最新情况是什么?(其他大多数线程都是3-4岁)。
我希望能做些像.
import pandas as pd
class SomeData(pd.DataFrame):
# Methods
pass
ClsInstance = SomeData()
# Create a new column on ClsInstance?发布于 2017-11-24 07:22:17
我就是这么做的。我听从了建议,发现:
下面的示例仅显示构造pandas.DataFrame的新子类的用法。如果您遵循我的第一个链接中的建议,您也可以考虑对pandas.Series子类进行子类化,以考虑使用pandas.DataFrame子类的一维切片。
定义SomeData
import pandas as pd
import numpy as np
class SomeData(pd.DataFrame):
# This class variable tells Pandas the name of the attributes
# that are to be ported over to derivative DataFrames. There
# is a method named `__finalize__` that grabs these attributes
# and assigns them to newly created `SomeData`
_metadata = ['my_attr']
@property
def _constructor(self):
"""This is the key to letting Pandas know how to keep
derivative `SomeData` the same type as yours. It should
be enough to return the name of the Class. However, in
some cases, `__finalize__` is not called and `my_attr` is
not carried over. We can fix that by constructing a callable
that makes sure to call `__finlaize__` every time."""
def _c(*args, **kwargs):
return SomeData(*args, **kwargs).__finalize__(self)
return _c
def __init__(self, *args, **kwargs):
# grab the keyword argument that is supposed to be my_attr
self.my_attr = kwargs.pop('my_attr', None)
super().__init__(*args, **kwargs)
def my_method(self, other):
return self * np.sign(self - other)游行示威
mydata = SomeData(dict(A=[1, 2, 3], B=[4, 5, 6]), my_attr='an attr')
print(mydata, type(mydata), mydata.my_attr, sep='\n' * 2)
A B
0 1 4
1 2 5
2 3 6
<class '__main__.SomeData'>
an attrnewdata = mydata.mul(2)
print(newdata, type(newdata), newdata.my_attr, sep='\n' * 2)
A B
0 2 8
1 4 10
2 6 12
<class '__main__.SomeData'>
an attrnewerdata = mydata.my_method(newdata)
print(newerdata, type(newerdata), newerdata.my_attr, sep='\n' * 2)
A B
0 -1 -4
1 -2 -5
2 -3 -6
<class '__main__.SomeData'>
an attr格查斯
这与pd.DataFrame.equals方法有关。
newerdata.equals(newdata) # Should be `False`跟踪(最近一次调用)在() ->1 newerdata.equals(新数据) ~/anaconda3 3中/envs/3.6.ml/lib/python3.6/site-packages/pandas/core/generic.py等于(自我,其他) 1034相同的位置被认为是平等的。1035“”-> 1036如果不是isinstance(其他,self._constructor):1037返回self._data.equals(other._data) TypeError: isinstance() arg 2必须是类型的一个或多个元组
所发生的情况是,该方法预期将在type属性中找到一个类型为_constructor的对象。相反,它发现了我放置在那里的可调用性,以解决我遇到的__finalize__问题。
围绕着工作
使用类定义中的以下内容重写equals方法。
def equals(self, other):
try:
pd.testing.assert_frame_equal(self, other)
return True
except AssertionError:
return False
newerdata.equals(newdata) # Should be `False`
Falsehttps://stackoverflow.com/questions/47466255
复制相似问题