vérifier si la variable est dataframe

131

quand ma fonction f est appelée avec une variable, je veux vérifier si var est un dataframe pandas:

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

Je suppose que la solution peut être assez simple mais même avec

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

Je ne peux pas le faire fonctionner comme prévu.

trbck
la source
1
Votre code dit "si varest égal à un dataframe vide". Ce que vous voulez vraiment, c'est "si le type de varest égal au type pd.DataFrame". Vous pouvez vérifier cela en utilisantisinstance
Katriel

Réponses:

182

Utilisez isinstance, rien d'autre:

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

PEP8 dit explicitement que isinstancec'est la meilleure façon de vérifier les types

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

Et ne pense même pas

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

isinstancegère l'héritage (voir Quelles sont les différences entre type () et isinstance ()? ). Par exemple, il vous dira si une variable est une chaîne (soit strou unicode), car elle dérive de basestring)

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

Spécifiquement pour les pandas DataFrameobjets:

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

Utilisez la isinstance()fonction intégrée.

import pandas as pd

def f(var):
    if isinstance(var, pd.DataFrame):
        print("do stuff")
Rutger Kassies
la source
3
Comment pouvez-vous généraliser cela au cas où un utilisateur peut utiliser la fonction que vous définissez, mais ne l'a pas fait import pandas as pd, mais simplement import pandas? Jouez simplement orsur les deux possibilités, ou y a-t-il quelque chose de plus sophistiqué que je ne connais pas?
n1k31t4
1
Une solution potentielle pourrait être de placer l'instruction import dans la fonction afin qu'il n'y ait aucune chance qu'un utilisateur importe des pandas en utilisant une autre méthode. Pour accélérer les choses (pour éviter d'importer toute la bibliothèque de panda pour une simple vérification), vous pouvez simplement utiliser quelque chose comme import pandas.DataFrame as panda_type, puis à l'intérieur, puis vérifier le type de tableau en utilisantisinstance(var, panda_type)
pacificgilly1992