Python中最有效的方法是检查对象属性是否分配了DataFrames?

时间:2015-09-28 11:14:27

标签: python pandas attributes dataframe inspect

我正在尝试构建一个类中所有属性的名称列表,这些属性是pandas DataFrames或Series。

以下工作但似乎很慢,因为它遍历dir()列出的每个属性,包括特殊方法(特殊方法不是DataFrames,所以不需要检查它们)。它似乎也在其他方法中执行print语句,因此不确定是否正在运行其他属性(不需要)。

my_instance = MyClass()
pd_objects = [attr for attr in dir(my_instance) if 
              isinstance(getattr(my_instance, attr), pd.DataFrame)
              or isinstance(getattr(my_instance, attr), pd.Series)] 

有关快速列出分配了pandas对象的属性的更有效方法的任何想法,可能使用inspect模块?

2 个答案:

答案 0 :(得分:2)

我不知道使用inspect()模块的任何方法,而是dir(),您可以尝试使用vars(),它会返回传递给对象的__dict__它,所以它没有特殊的方法,等等。例如 -

my_instance = MyClass()
pd_objects = [attr for attr in vars(my_instance) if 
          isinstance(getattr(my_instance, attr), pd.DataFrame)
          or isinstance(getattr(my_instance, attr), pd.Series)]

请注意,这仍然会评估属性,因为没有评估属性,就无法确定它包含/返回的内容(这很可能是你看到的print语句被执行了。

vars([object]) -

  

返回具有__dict__属性的模块,类,实例或任何其他对象的__dict__属性。

答案 1 :(得分:1)

您想使用class SessionsController < ApplicationController def new end def create user = User.find_by(name: params[:session][:name]) if user && user.authenticate(params[:session][:password]) sign_in user redirect_to user # Sign the user in and redirect to the user's show page. else flash.now[:error] = 'Invalid email/password combination' redirect 'new' end end def destroy end end

__dict__

然后像这样使用它:

class A(object):
    def __init__(self):
        self.df2 = pd.DataFrame({'df2': range(5)})
        self.sr2 = pd.Series(range(5))
        self.x = 4
        self.y = 'abc'
        self.z = []


def get_attributes_of_type(cls, types):
    return [i for _, i in cls.__dict__.iteritems() if isinstance(i, types)]