ตรวจสอบว่าตัวแปรคือ dataframe หรือไม่


131

เมื่อฟังก์ชัน f ของฉันถูกเรียกด้วยตัวแปรฉันต้องการตรวจสอบว่า var เป็นดาต้าเฟรมแพนด้าหรือไม่:

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

ฉันเดาว่าวิธีแก้ปัญหาอาจค่อนข้างง่าย แต่ถึงแม้จะมี

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

ฉันไม่สามารถทำให้มันทำงานได้อย่างที่คาดไว้


1
โค้ดของคุณระบุว่า "if varเท่ากับ dataframe ว่าง" สิ่งที่คุณต้องการจริงๆคือ "ถ้าประเภทvarเท่ากับประเภทpd.DataFrame" คุณสามารถตรวจสอบได้โดยใช้isinstance
Katriel

คำตอบ:


182

ใช้isinstanceไม่มีอะไรอื่น:

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

PEP8กล่าวอย่างชัดเจนว่าisinstanceเป็นวิธีที่แนะนำในการตรวจสอบประเภท

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 ()? ) ตัวอย่างเช่นจะบอกคุณว่าตัวแปรเป็นสตริง (อย่างใดอย่างหนึ่งstrหรือunicode) เนื่องจากได้รับมาจาก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 pandas.DataFrame as panda_typeจากนั้นภายในจากนั้นตรวจสอบประเภทอาร์เรย์โดยใช้isinstance(var, panda_type)
pacificgilly1992
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.