変数がデータフレームかどうかを確認


129

私の関数fが変数で呼び出されたとき、varがpandasデータフレームかどうかを確認したい:

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

解決策はかなり簡単かもしれませんが、

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

期待どおりに動作しません。


1
あなたのコードは「if varが空のデータフレームと等しい」と言っています。あなたが本当に欲しいのは、「の型が型varと等しい場合pd.DataFrame」です。あなたはそれを使用してそれをチェックすることができますisinstance
カトリエル

回答:


179

isinstance他に何も使用しない:

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

PEP8isinstanceは、タイプをチェックするための好ましい方法であると明確に述べています

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()の違い何ですか?を参照)。変数が文字列(のいずれかである場合たとえば、それはあなたを教えてくれますstrunicode)どこから派生しているため、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
考えられる解決策は、関数内にimportステートメントを配置して、ユーザーが他の方法を使用してパンダをインポートする可能性がないようにすることです。速度を上げるには(単純なチェックのためにパンダライブラリ全体をインポートしないようにするため)、次のように使用import pandas.DataFrame as panda_typeし、内部で配列タイプをチェックしますisinstance(var, panda_type)
pacificgilly1992
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.