【问题标题】:subclassing dataframe with specific columns使用特定列对数据框进行子类化
【发布时间】:2019-04-26 05:12:42
【问题描述】:

我正在尝试创建自己的 Dataframe 类。当我调用它时,我希望它有一些特定的列。所以我这样做:

from pandas import DataFrame

class MyClass(DataFrame):  

    def __init__(self):    
        super(MyClass, self).__init__(columns=['Class','Conditions']) 

但是,当我尝试向其附加数据时,

test = MyClass()
#test = MyClass(columns=['Class','Conditions'])

test.loc[2] = ['class2',[1, 2, 3]]

我收到一个错误:

文件“C:\Miniconda3\lib\site-packages\pandas\core\indexing.py”,行 189,在setitem中 self._setitem_with_indexer(indexer, value)

文件“C:\Miniconda3\lib\site-packages\pandas\core\indexing.py”,行 451,在_setitem_with_indexer中 self.obj._data = self.obj.append(value)._data

文件“C:\Miniconda3\lib\site-packages\pandas\core\frame.py”,行 6211,附加 排序=排序)

文件 “C:\Miniconda3\lib\site-packages\pandas\core\reshape\concat.py”,行 226,连续 返回 op.get_result()

文件 “C:\Miniconda3\lib\site-packages\pandas\core\reshape\concat.py”,行 428,在 get_result 中 return (cons._from_axes(new_data, self.new_axes)

文件“C:\Miniconda3\lib\site-packages\pandas\core\generic.py”,行 第356章 返回 cls(data, **kwargs)

TypeError: init() 接受 1 个位置参数,但给出了 2 个

我意识到如果我不声明 __init__ 中的列并在创建类后分配它们,我没有问题。

但是,我想用这些名称作为列来创建类。

非常感谢。

【问题讨论】:

  • 我无法复制。你能提供一个minimal reproducible example 来代替Condition('var2',op.ne,3) 吗?
  • 对不起@jpp 我的错。您可以用列表替换条件。像 [1,2,3]。我更新了这个例子。谢谢你。问候
  • 它是否需要是 DataFrame 的子类 - 除非你要添加/覆盖方法等...看起来你可以做 MyDataFrame = functools.partial(DataFrame, columns=['Class', 'Condtions']) 来修复调用的列参数并使用它?
  • @GermánMartínez,您的代码在 v0.19.2 中对我来说可以正常工作。你用的是什么版本?
  • 嗨@jpp,代码有效,但我希望在构造对象时预定义列。问候

标签: python pandas class dataframe subclassing


【解决方案1】:

如果要使用构造函数进行初始化,则必须将参数传递给父__init__

>>> class MyClass(DataFrame):                                                                                                                                              
        def __init__(self, *args, **kwargs):                                                                                                                                   
            kwargs['columns'] = ['Class', 'Conditions']                                                                                                                        
            super(MyClass, self).__init__(*args, **kwargs)                                                                                                                     

>>> md = MyClass({'Class': [1, 2, 3]})
>>> md
   Class Conditions
0      1        NaN
1      2        NaN
2      3        NaN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 2016-08-08
    • 2013-08-15
    • 1970-01-01
    • 2015-11-04
    • 2021-04-16
    • 2016-01-13
    相关资源
    最近更新 更多