проверьте, является ли переменная кадром данных

131

когда моя функция f вызывается с переменной, я хочу проверить, является ли var фреймом данных pandas:

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

Думаю, решение может быть довольно простым, но даже с

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

Я не могу заставить его работать так, как ожидалось.

trbck
источник
1
В вашем коде написано: «if varравно пустому фрейму данных». Что вам действительно нужно, так это «если тип varравен типу pd.DataFrame». Вы можете проверить это с помощьюisinstance
Катриэль

Ответы:

182

Используйте isinstance, больше ничего:

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

PEP8 прямо говорит, что isinstanceэто предпочтительный способ проверки типов

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

И даже не думай о

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

isinstanceобрабатывает наследование (см. В чем разница между type () и isinstance ()? ). Например, он скажет вам, является ли переменная строкой (или strили unicode), потому что они происходят от basestring)

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

Специально для pandas DataFrameобъектов:

import pandas as pd
isinstance(var, pd.DataFrame)
Якуб М.
источник
131

Воспользуйтесь встроенной isinstance()функцией.

import pandas as pd

def f(var):
    if isinstance(var, pd.DataFrame):
        print("do stuff")
Рутгер Кэссис
источник
3
Как вы можете обобщить это на случай, когда пользователь может использовать определенную вами функцию, но не сделал этого import pandas as pd, а вместо этого просто import pandas? Просто выполните orобе возможности, или есть что-то более сложное, о чем я не знаю?
n1k31t4
1
Потенциальным решением может быть размещение оператора импорта внутри функции, чтобы пользователь не мог импортировать панды каким-либо другим методом. Чтобы ускорить процесс (чтобы избежать импорта всей библиотеки panda для простой проверки), вы можете просто использовать что-то вроде, import pandas.DataFrame as panda_typeа затем внутри и проверить тип массива с помощьюisinstance(var, panda_type)
pacificgilly1992