【python】判断空值
各空值类型
df=pd.DataFrame()
df['a']=pd.NaT # datetime64[ns] # pandas中pd.NaT
表示 not a time。
df['b']=np.nan # float64 # NaN是numpy\pandas下的,不是Python原生的,Not a Number的简称。
df['c']=None # object # None是一个python特殊的数据类型。
df.info()
字符串
module_list=None
module_list=None print('module_list:%s'%module_list) print('module_list.isnull:%s'%pd.isnull(module_list)) print('pd.isna():%s'%pd.isna(module_list)) print('module_list is None:%s'%(module_list is None)) print('not module_list:%s'%(not module_list)) print('not module_list is None:%s'%(not module_list is None)) print('not (module_list is None):%s'%(not (module_list is None)))
小心有坑:
x = 1 print('not x:%s'%(not x)) x = [1] print('not x:%s'%(not x)) x = 0 print('not x:%s'%(not x)) x = [0] print('not x:%s'%(not x))
因为在python中 None, False, 空字符串””, 0, 空列表[], 空字典{}, 空元组()都相当于False,即:
not None == not False == not '' == not 0 == not [] == not {} == not ()
if x is not None
是最好的写法,清晰,不会出现错误,以后坚持使用这种写法。
使用if not x
这种写法的前提是:必须清楚x等于None, False, 空字符串””, 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行。
def _get_judge(x): if x is not None: print(x) else: print('x is None') print('-'*20) x=None _get_judge(x) x=[] _get_judge(x) x=[None] _get_judge(x) x=0 _get_judge(x) x=np.nan _get_judge(x)
判断tuple、list、dict是否为空
tuple_test = () print(bool(tuple_test)) tuple_test = [] print(bool(tuple_test)) tuple_test = {} print(bool(tuple_test))
if not xxx:
在使用列表的时候,如果你想区分x==[]
和x==None
两种情况的话, 此时if not x:
将会出现问题:
module_list=”
module_list='' print('module_list:%s'%module_list) print('module_list.isnull:%s'%pd.isnull(module_list)) print('len(module_list):%s'%len(module_list))
module_list=np.nan
module_list=np.nan print('module_list:%s'%module_list) print('module_list.isnull:%s'%pd.isnull(module_list)) print('math.isnan(module_list):%s'%math.isnan(module_list)) print('pd.isna():%s'%pd.isna(module_list))
>>> np.nan nan >>> type(np.nan) <type 'float'>
nan的类型是float,当对nan进行强制类型转换时,转换为整数型时会报错
>>> int(np.nan) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: cannot convert float NaN to integer >>> long(np.nan) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: cannot convert float NaN to integer >>> int('nan') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'nan'
如果是报上面的错前两个错,则是因为被转型的已经是一个float的nan(np.nan),如果是报第三个错,则被转换的是字符串’nan’
而将nan或’nan’从字符串到float转换时,都不会出现错误。这也是有时候会隐藏的错误,因为numpy的ndarray是支持复合类型的(如object),如果是一个非法字符被先后转换为float,string,则会表现出是一个string,如果进行强转,则报第三个错。而且此时不能用x!=x判断。
现在python的大部分普通运算中已经不会出现nan,但是在numpy包中,从list转换nparray时,如果遇到类型不匹配,或其他问题导致转换失败时,仍然会以nan填充,而不是报错。
pandas中怎样判断某个字段不是NaT
pandas中pd.NaT
表示 not a time。
如果要判断一个时间是不是pd.NaT
可以使用pd.isna()
、pd.notna()
等方法。
表格
module_list=pd.DataFrame(index=[0])
module_list=pd.DataFrame(index=[0]) print(module_list) print('module_list.empty:%s'%module_list.empty) print('len(module_list):{}'.format(len(module_list)))
module_list=pd.DataFrame()
module_list=pd.DataFrame() print(module_list) print('module_list.empty:%s'%module_list.empty) print('len(module_list):{}'.format(len(module_list)))