用特定列对数据框进行子类化

时间:2018-11-23 15:22:57

标签: python pandas class dataframe subclassing

我正在尝试创建自己的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,在设置项目中       self._setitem_with_indexer(索引器,值)

     

文件“ 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       sort = sort)

     

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

     

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

     

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

     

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

我意识到,如果我没有在__init__中声明这些列,并且在创建类之后就对其进行了分配,那么我没有问题。

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

非常感谢。

1 个答案:

答案 0 :(得分:2)

如果要使用构造函数进行初始化,则必须将参数传递给父__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