verifique se a variável é dataframe

130

quando minha função f é chamada com uma variável, quero verificar se var é um dataframe do pandas:

def f(var):
    if var == pd.DataFrame():
        print "do stuff"

Eu acho que a solução pode ser bastante simples, mas mesmo com

def f(var):
    if var.values != None:
        print "do stuff"

Não consigo fazê-lo funcionar como esperado.

trbck
fonte
1
Seu código diz "se varé igual a um quadro de dados vazio". O que você realmente deseja é "se o tipo de varfor igual ao tipo pd.DataFrame". Você pode verificar isso usandoisinstance
Katriel

Respostas:

180

Use isinstance, nada mais:

if isinstance(x, pd.DataFrame):
    ... # do something

O PEP8 diz explicitamente que isinstanceé a maneira preferida de verificar os tipos

No:  type(x) is pd.DataFrame
No:  type(x) == pd.DataFrame
Yes: isinstance(x, pd.DataFrame)

E nem pense em

if obj.__class__.__name__ = 'DataFrame':
    expect_problems_some_day()

isinstancelida com herança (consulte Quais são as diferenças entre type () e isinstance ()? ). Por exemplo, ele informará se uma variável é uma string (ou strou unicode), porque elas derivam de basestring)

if isinstance(obj, basestring):
    i_am_string(obj)

Especificamente para pandas DataFrameobjetos:

import pandas as pd
isinstance(var, pd.DataFrame)
Jakub M.
fonte
131

Use a isinstance()função interna.

import pandas as pd

def f(var):
    if isinstance(var, pd.DataFrame):
        print("do stuff")
Rutger Kassies
fonte
3
Como você pode generalizar isso para o caso em que um usuário pode usar a função que você define, mas não o fez import pandas as pd, mas apenas import pandas? Basta executar um orem ambas as possibilidades, ou há algo mais sofisticado que eu não conheço?
N1k31t4
1
Uma solução em potencial poderia ser colocar a instrução de importação dentro da função, para que não haja chance de um usuário importar pandas usando algum outro método. Para acelerar as coisas (para evitar importar toda a biblioteca do panda para uma verificação simples), você pode simplesmente usar algo como import pandas.DataFrame as panda_typee, em seguida, verificar o tipo de matriz usandoisinstance(var, panda_type)
pacificgilly1992