各空值类型

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:将会出现问题:

x=[]
y=None
print('not x:%s'%(not x))
print('not y:%s'%(not y))
print(' ')
print('x is None:%s'%(x is None))
print('y is None:%s'%(y is None))

module_list=[]

if len(mylist):
    # Do something with my list
else:
    # The list is empty

由于一个空 list 本身等同于 False,所以可以直接:

if mylist:
    # Do something with my list
else:
    # The list is empty

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)))

 

版权声明:本文为牛奶加布丁原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/MilkAndPudding/p/16202336.html