Überprüfen Sie, ob die Variable ein Datenrahmen ist

129

Wenn meine Funktion f mit einer Variablen aufgerufen wird, möchte ich überprüfen, ob var ein Pandas-Datenrahmen ist:

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

Ich denke, die Lösung könnte recht einfach sein, aber auch mit

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

Ich kann es nicht wie erwartet zum Laufen bringen.

trbck
quelle
1
Ihr Code sagt "wenn vargleich einem leeren Datenrahmen". Was Sie wirklich wollen, ist "wenn der Typ vargleich dem Typ ist pd.DataFrame". Sie können dies überprüfen mitisinstance
Katriel

Antworten:

179

Verwenden Sie isinstancenichts anderes:

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

PEP8 sagt ausdrücklich, dass dies isinstancedie bevorzugte Methode zum Überprüfen von Typen ist

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

Und denk nicht mal darüber nach

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

isinstancebehandelt die Vererbung (siehe Was sind die Unterschiede zwischen type () und isinstance ()? ). Zum Beispiel wird es Ihnen sagen , ob eine Variable eine Zeichenfolge (entweder stroder unicode), weil sie aus ableiten basestring)

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

Speziell für pandas DataFrameObjekte:

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

Verwenden Sie die eingebaute isinstance()Funktion.

import pandas as pd

def f(var):
    if isinstance(var, pd.DataFrame):
        print("do stuff")
Rutger Kassies
quelle
3
Wie können Sie dies auf den Fall verallgemeinern, in dem ein Benutzer die von Ihnen definierte Funktion verwenden kann, dies aber nicht getan hat import pandas as pd, sondern nur import pandas? Führen Sie einfach orbeide Möglichkeiten aus, oder gibt es etwas Anspruchsvolleres, von dem ich nichts weiß?
n1k31t4
1
Eine mögliche Lösung könnte darin bestehen, die import-Anweisung in die Funktion einzufügen, damit ein Benutzer keine Pandas mit einer anderen Methode importieren kann. Um die Dinge zu beschleunigen (um zu vermeiden, dass die gesamte Panda-Bibliothek für eine einfache Überprüfung importiert wird), können Sie einfach so etwas verwenden import pandas.DataFrame as panda_typeund dann den Array-Typ mitisinstance(var, panda_type)
pacificgilly1992