2016-07-25 72 views
1

我创建了一个类来预处理带有熊猫数据框的文档。但是,我在课堂上使用过滤器时遇到问题。我的代码如下:在类中使用数据框来过滤结果

class Dataframe: 
    def __init__(self, my_dataframe): 
     self.my_dataframe = my_dataframe 
     self.my_dataframe = self.filter_priv() 

    def filter_priv(self): 
     df = self.my_dataframe.copy() 
     df = df[~(df.priv_id > -1) | ~(df.restriction_level > 0)] 

df1 = Dataframe(df) 

df 

我的输出始终是未过滤的结果。我的输入文件有262,000条记录,当使用过滤器时,在我的课程外部调用时,它成功地将我的df过滤到11,000条记录。任何想法为什么它不会在课堂上过滤?

+0

你不会从'filter_priv'返回任何东西。这是你的意图吗? – SethMMorton

回答

0

你的问题可能是你正在使用的变量“DF”初始化数据框类,但是变量DF尚未定义...

0

你这样做方式错误。你是从数据框中继承的,但是你将数据存储在一个特殊的数据框属性中。没有bueno。

如果你想让一个像数据框一样庸俗的类,但是你想添加一些不可用的其他行为,你应该继承子类。

如果你想继承,你应该做这样的:

class Dataframe(DataFrame): 
    def __init__(self, *args, **kwargs): 
     super(Dataframe, self).__init__(*args, **kwargs) 

    def filter_priv(self): 
     return self[~(self.priv_id > -1) | ~(self.restriction_level > 0)] 

# Not sure if you can create a dataframe from another 
df1 = Dataframe(df) 

但是,这真的可能甚至不是你想要的。这可能是更好的只是:

def filter_priv(df): 
    return df[~(df.priv_id > -1) | ~(df.restriction_level > 0)] 

df1 = filter_priv(df) 
+0

但OP没有继承DataFrame。在你的例子中,你不是继承DataFrame的,所以'super'不会像你所描述的那样。 – SethMMorton

+0

啊...我现在看到了(这也解释了为什么我没有子类,因为我只是复制/粘贴代码)。显然,我简单地假设*任何创建一个名为Dataframe的类都会这样做来为大熊猫DataFrame子类化,因为为什么你会创建一个类并将其命名为几乎相同的东西? –