controlla se la variabile è dataframe


131

quando la mia funzione f viene chiamata con una variabile, voglio verificare se var è un dataframe pandas:

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

Immagino che la soluzione potrebbe essere abbastanza semplice ma anche con

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

Non riesco a farlo funzionare come previsto.


1
Il tuo codice dice "se varè uguale a un dataframe vuoto". Quello che vuoi veramente è "se il tipo di varè uguale al tipo pd.DataFrame". Puoi verificarlo usandoisinstance
Katriel

Risposte:


182

Usa isinstance, nient'altro:

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

PEP8 dice esplicitamente che isinstanceè il modo preferito per controllare i tipi

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

E non pensarci nemmeno

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

isinstancegestisce l'ereditarietà (vedere Quali sono le differenze tra type () e isinstance ()? ). Ad esempio, ti dirà se una variabile è una stringa (o stro unicode), perché derivano da basestring)

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

Specifico per pandas DataFrameoggetti:

import pandas as pd
isinstance(var, pd.DataFrame)

131

Usa la isinstance()funzione incorporata.

import pandas as pd

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

3
Come puoi generalizzare questo al caso in cui un utente può utilizzare la funzione che hai definito, ma non l'ha fatto import pandas as pd, ma invece solo import pandas? Esegui semplicemente una orsu entrambe le possibilità, o c'è qualcosa di più sofisticato che non conosco?
n1k31t4

1
Una potenziale soluzione potrebbe essere quella di inserire l'istruzione import all'interno della funzione in modo che non vi sia alcuna possibilità che un utente importi i panda utilizzando un altro metodo. Per velocizzare le cose (per evitare di importare l'intera libreria panda per un semplice controllo) potresti semplicemente usare qualcosa di simile import pandas.DataFrame as panda_typee poi all'interno, quindi controllare il tipo di array usandoisinstance(var, panda_type)
pacificgilly1992
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.