periksa apakah variabel adalah dataframe

131

ketika fungsi saya f dipanggil dengan variabel, saya ingin memeriksa apakah var adalah pandas dataframe:

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

Saya kira solusinya mungkin cukup sederhana tetapi bahkan dengan

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

Saya tidak bisa membuatnya bekerja seperti yang diharapkan.

trbck
sumber
1
Kode Anda mengatakan "jika varsama dengan dataframe kosong". Apa yang Anda inginkan adalah "jika jenisnya varsama dengan jenisnya pd.DataFrame". Anda dapat memeriksanya menggunakanisinstance
Katriel

Jawaban:

182

Gunakan isinstance, tidak ada yang lain:

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

PEP8 mengatakan secara eksplisit bahwa isinstancecara yang disukai untuk memeriksa tipe

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

Dan jangan pernah memikirkannya

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

isinstancemenangani inheritance (lihat Apa perbedaan antara type () dan isinstance ()? ). Misalnya, ini akan memberi tahu Anda jika variabel adalah string (baik stratau unicode), karena diturunkan dari basestring)

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

Khusus untuk pandas DataFrameobjek:

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

Gunakan fungsi built-in isinstance().

import pandas as pd

def f(var):
    if isinstance(var, pd.DataFrame):
        print("do stuff")
Rutger Kassies
sumber
3
Bagaimana Anda bisa menggeneralisasi ini untuk kasus di mana pengguna dapat menggunakan fungsi yang Anda tetapkan, tetapi tidak import pandas as pd, tetapi hanya import pandas? Lakukan saja orpada kedua kemungkinan, atau adakah sesuatu yang lebih canggih yang tidak saya ketahui?
n1k31t4
1
Solusi potensial adalah dengan meletakkan pernyataan import di dalam fungsi sehingga tidak ada kemungkinan pengguna mengimpor panda menggunakan metode lain. Untuk mempercepat (untuk menghindari mengimpor seluruh perpustakaan panda untuk pemeriksaan sederhana) Anda bisa menggunakan sesuatu seperti import pandas.DataFrame as panda_typedan kemudian di dalam kemudian memeriksa jenis array menggunakanisinstance(var, panda_type)
pacificgilly1992