首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >子类的熊猫DataFrame,更新?

子类的熊猫DataFrame,更新?
EN

Stack Overflow用户
提问于 2017-11-24 04:10:15
回答 1查看 2.4K关注 0票数 2

继承还是不继承?

关于Pandas子类问题的最新情况是什么?(其他大多数线程都是3-4岁)。

我希望能做些像.

代码语言:javascript
运行
复制
import pandas as pd

class SomeData(pd.DataFrame):
    # Methods
    pass

ClsInstance = SomeData()

# Create a new column on ClsInstance?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-24 07:22:17

我就是这么做的。我听从了建议,发现:

下面的示例仅显示构造pandas.DataFrame的新子类的用法。如果您遵循我的第一个链接中的建议,您也可以考虑对pandas.Series子类进行子类化,以考虑使用pandas.DataFrame子类的一维切片。

定义SomeData

代码语言:javascript
运行
复制
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)

游行示威

代码语言:javascript
运行
复制
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 attr
代码语言:javascript
运行
复制
newdata = 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 attr
代码语言:javascript
运行
复制
newerdata = 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方法有关。

代码语言:javascript
运行
复制
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方法。

代码语言:javascript
运行
复制
    def equals(self, other):
        try:
            pd.testing.assert_frame_equal(self, other)
            return True
        except AssertionError:
            return False

newerdata.equals(newdata)  # Should be `False`

False
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47466255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档