verificar si la variable es dataframe

130

cuando se llama a mi función f con una variable, quiero verificar si var es un marco de datos de pandas:

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

Supongo que la solución podría ser bastante simple, pero incluso con

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

No puedo hacer que funcione como se esperaba.

trbck
fuente
1
Su código dice "si vares igual a un marco de datos vacío". Lo que realmente quieres es "si el tipo de vares igual al tipo pd.DataFrame". Puede verificar eso usandoisinstance
Katriel

Respuestas:

180

Uso isinstance, nada más:

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

PEP8 dice explícitamente que esa isinstancees la forma preferida de verificar tipos

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

Y ni siquiera pienses en

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

isinstancemaneja la herencia (consulte ¿Cuáles son las diferencias entre type () e isinstance ()? ). Por ejemplo, le dirá si una variable es una cadena (ya sea stro unicode), porque derivan de basestring)

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

Específicamente para pandas DataFrameobjetos:

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

Use la isinstance()función incorporada.

import pandas as pd

def f(var):
    if isinstance(var, pd.DataFrame):
        print("do stuff")
Rutger Kassies
fuente
3
¿Cómo puede generalizar esto al caso en el que un usuario puede usar la función que define, pero no lo hizo import pandas as pd, sino simplemente import pandas? Simplemente realice una oren ambas posibilidades, o ¿hay algo más sofisticado que no conozca?
n1k31t4
1
Una posible solución podría ser colocar la declaración de importación dentro de la función para que no haya posibilidad de que un usuario importe pandas utilizando algún otro método. Para acelerar las cosas (para evitar importar toda la biblioteca de pandas para una simple verificación), puede usar algo como import pandas.DataFrame as panda_typey luego adentro y luego verificar el tipo de matriz usandoisinstance(var, panda_type)
pacificgilly1992