sprawdź, czy zmienna to dataframe

133

kiedy moja funkcja f jest wywoływana ze zmienną, chcę sprawdzić, czy var jest ramką danych pandy:

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

Myślę, że rozwiązanie może być dość proste, ale nawet z

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

Nie mogę zmusić go do działania zgodnie z oczekiwaniami.

trbck
źródło
1
Twój kod mówi „jeśli varjest równe pustej ramce danych”. To, czego naprawdę chcesz, to „jeśli typ varjest równy typowi pd.DataFrame”. Możesz to sprawdzić za pomocąisinstance
Katriel,

Odpowiedzi:

182

Użyj isinstance, nic więcej:

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

PEP8 wyraźnie mówi, że isinstancejest to preferowany sposób sprawdzania typów

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

I nawet o tym nie myśl

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

isinstanceobsługuje dziedziczenie (zobacz Jakie są różnice między type () a isinstance ()? ). Na przykład powie ci, czy zmienna jest ciągiem (albo strlub unicode), ponieważ pochodzi od basestring)

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

Specjalnie dla pandas DataFrameobiektów:

import pandas as pd
isinstance(var, pd.DataFrame)
Jakub M.
źródło
131

Użyj funkcji wbudowanej isinstance().

import pandas as pd

def f(var):
    if isinstance(var, pd.DataFrame):
        print("do stuff")
Rutger Kassies
źródło
3
Jak można to uogólnić na przypadek, w którym użytkownik może użyć funkcji, którą zdefiniowałeś, ale tego nie zrobił import pandas as pd, a zamiast tego po prostu import pandas? Po prostu wykonaj orna obu możliwościach, czy jest coś bardziej wyrafinowanego, o którym nie wiem?
n1k31t4
1
Potencjalnym rozwiązaniem może być umieszczenie instrukcji import wewnątrz funkcji, aby użytkownik nie zaimportował pandy inną metodą. Aby przyspieszyć działanie (aby uniknąć importowania całej biblioteki pandy w celu prostego sprawdzenia), możesz po prostu użyć czegoś takiego, import pandas.DataFrame as panda_typea następnie wewnątrz, a następnie sprawdzić typ tablicy za pomocąisinstance(var, panda_type)
pacificgilly1992