当前位置: 首页 > 面试题库 >

子类化Pandas DataFrame,可以更新吗?

邢昂然
2023-03-14
问题内容

继承还是不继承?

关于Pandas子类化问题的最新消息是什么?(其他大多数线程都使用3-4年)。

我希望做类似…

import pandas as pd

class SomeData(pd.DataFrame):
    # Methods
    pass

ClsInstance = SomeData()

# Create a new column on ClsInstance?

问题答案:

这就是我的方法。我遵循了发现的建议:

  • 子类化熊猫数据结构
  • 修复完成问题

以下示例仅显示了构造的新子类的用法pandas.DataFrame。如果您按照我的第一个链接中的建议进行操作,则也可以考虑使用子类化pandas.Series,以考虑获取pandas.DataFrame子类的一维切片。

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 attr



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



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

newerdata.equals(newdata)  # Should be `False`
TypeError                                 Traceback (most recent call

last)
python-input-304-866170ab179e> in ()
----> 1 newerdata.equals(newdata)
python-input-304-866170ab179e>

~/anaconda3/envs/3.6.ml/lib/python3.6/site-

packages/pandas/core/generic.py in equals(self, other)
1034 the same location are considered equal.
1035 “”“
-> 1036 if not isinstance(other, self._constructor):
1037 return False
1038 return self._data.equals(other._data)

TypeError: isinstance() arg 2 must be a type or tuple of types

发生的事情是该方法希望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`

False


 类似资料:
  • 问题内容: 我想采用一个现有的枚举,并向其添加更多元素,如下所示: 这在Java中可行吗? 问题答案: 不,你无法使用Java执行此操作。除了别的什么,d大概就是A(扩展的“正常”想法)的一个实例,但是只知道这一点的用户却一无所知-这违背了枚举作为一组众所周知的集合的观点。价值观。 如果你可以告诉我们更多有关如何使用它的信息,我们可能会建议其他解决方案。

  • Solr4提供了对索引中现有文档进行原子(部分)更新的功能。即。可以匹配文档ID并替换一个字段的内容,或者向多值字段添加更多条目:http://wiki.apache.org/solr/atomicupdates 原子更新可以从DataImportHandler(DIH)完成吗?

  • 问题内容: 我在android / java中对Location的子类进行序列化遇到了麻烦 位置不可序列化。我有一个名为FALocation的第一个子类,它没有任何实例变量。我已经宣布它可序列化。 然后,我有一个名为Waypoint的第二个类,看起来像这样: 序列化工作正常。 反序列化会产生跟随翼异常(腿对象包含一个航路点): 问题答案: 序列化位置绝对必要吗?也许您可以将其标记为瞬态,并在反序列

  • 我有一个问题与primeface数据表。我有一个数据与一些条目和一个列与一个按钮内。如果按钮被按下,一个弹出窗口打开与另一个数据表。第二个数据表中的条目取决于行中的按钮被按下。 Bean2 问题是弹出式数据表中没有列出任何条目,尽管在db查询之后的列表中有一些条目。 有没有办法修复这个bug?提前感谢! 更新1:

  • 问题内容: 我有以下课程: 这可以按预期工作(使用字符串的单词而不是字母来初始化集合)。但是,当我想对set的不可变版本执行相同操作时,该方法似乎被忽略: 我可以达到类似的目的吗? 问题答案: 是的,您需要重写特殊方法: 输出为:

  • 问题内容: 在上一个问题中,我问过有关更新菜单栏的问题。BalusC告诉我,我需要添加包含菜单栏的表单。 我想扩展这个问题,以询问是否可以更新标题中的文本。正在使用模板,我使用填写了值 模板有 在标题中定义表单似乎很奇怪,因此没有定义。我在viewBacking.current中放置了一个断点,以便可以看到它何时使用它。即使我单击刷新以重新显示该窗体,它也不会再次达到断点。只有当我转到内容不同的其