pandas和Oracle中空值的比较及逻辑运算,数值型及时间型数据
(作者:陈玓玏)
下面代码所使用的原数据及读取数据的代码如下:
#取数代码
arr = pd.read_excel('C:/Users/cdl/Desktop/空值test_1.xlsx',encoding='gbk')
arr['strTest_1'] = arr['strTest'].apply(lambda x:str(x))
print(arr)
print(arr.dtypes)
#原数据及其类型
numTest timeTest strTest strTest_1
0 1.0 2017-08-10 one one
1 2.0 2018-08-10 two two
2 NaN 2019-08-10 NaN nan
3 3.0 NaT three three
4 NaN NaT four four
5 4.0 2020-08-10 NaN nan
numTest float64
timeTest datetime64[ns]
strTest object
strTest_1 object
dtype: object
一、数值型空值的比较
取数值大于2或小于等于2的行:
print(arr[arr['numTest']>2])
print(arr[arr['numTest']<=2])
输出结果为:
numTest timeTest strTest strTest_1
3 3.0 NaT three three
5 4.0 2020-08-10 NaN nan
numTest timeTest strTest strTest_1
0 1.0 2017-08-10 one one
1 2.0 2018-08-10 two two
我们发现,实际上是有六行的,但是能够进行大小比较的只有四行,空值不能参与比较!!!!这一点在过滤数据时要格外地注意,因为取数区间不对时可能会造成大量的数据损失!!!!在取建模样本时要尤其注意。
二、时间型空值的比较
当前时间是2018-08-21,那么分别取时间在今天之前和今天之后的行,代码如下:
#因为本身时间格式已经定了,所以把当前时间也格式化成统一形式了
print(arr[arr['timeTest']>time.strftime("%Y-%m-%d", time.localtime())])
print(arr[arr['timeTest']<=time.strftime("%Y-%m-%d", time.localtime())])
结果:
numTest timeTest strTest strTest_1
2 NaN 2019-08-10 NaN nan
5 4.0 2020-08-10 NaN nan
numTest timeTest strTest strTest_1
0 1.0 2017-08-10 one one
1 2.0 2018-08-10 two two
和数值型空值一样,时间型空值也不参与大小比较,要尤其注意。
三、数值型空值的计算
用数值型的列通过逻辑运算产生新的列:
arr['numTest_minus'] = arr['numTest']-1
print(arr)
结果:
numTest timeTest strTest strTest_1 numTest_minus
0 1.0 2017-08-10 one one 0.0
1 2.0 2018-08-10 two two 1.0
2 NaN 2019-08-10 NaN nan NaN
3 3.0 NaT three three 2.0
4 NaN NaT four four NaN
5 4.0 2020-08-10 NaN nan 3.0
空值与任何数值计算,均为空值。
四、时间型空值运算
计算时间差:
arr['timeTest_minus'] = arr['timeTest']-pd.to_datetime('2018-08-21')
#直接相减获得的列中会包含days字符串,要通过days属性取其天数
arr['timeTest_minus'] = arr['timeTest_minus'].apply(lambda x:x.days)
print(arr)
结果:
numTest timeTest strTest strTest_1 timeTest_minus
0 1.0 2017-08-10 one one -376.0
1 2.0 2018-08-10 two two -11.0
2 NaN 2019-08-10 NaN nan 354.0
3 3.0 NaT three three NaN
4 NaN NaT four four NaN
5 4.0 2020-08-10 NaN nan 720.0
新生成的DataFrame类型如下:
numTest float64
timeTest datetime64[ns]
strTest object
strTest_1 object
timeTest_minus float64
dtype: object
由结果可知,NaT不参与时间运算,运算结果随新的列的类型变化而更改,比如这里就从NaT变成了NaN。
五、Oracle中的空值比较和运算
Oracle中进行比较时,空值默认是最大的,因此在进行分组比较时要格外注意,如果是用分析函数,最好是用is not null把空值排除在外,或者在分析函数中规定over(partition by order by nulls last/first),规定空值在最前或最后,根据自己的需求来定,否则取数结果中可能会无端端多很多空值。
Oracle中空值运算时和pandas中一样,和任何值做任何运算都为空。
还没有评论,来说两句吧...