pandas和Oracle中空值的比较及逻辑运算,数值型及时间型数据

比眉伴天荒 2022-05-16 14:07 199阅读 0赞

(作者:陈玓玏)

下面代码所使用的原数据及读取数据的代码如下:

  1. #取数代码
  2. arr = pd.read_excel('C:/Users/cdl/Desktop/空值test_1.xlsx',encoding='gbk')
  3. arr['strTest_1'] = arr['strTest'].apply(lambda x:str(x))
  4. print(arr)
  5. print(arr.dtypes)
  6. #原数据及其类型
  7. numTest timeTest strTest strTest_1
  8. 0 1.0 2017-08-10 one one
  9. 1 2.0 2018-08-10 two two
  10. 2 NaN 2019-08-10 NaN nan
  11. 3 3.0 NaT three three
  12. 4 NaN NaT four four
  13. 5 4.0 2020-08-10 NaN nan
  14. numTest float64
  15. timeTest datetime64[ns]
  16. strTest object
  17. strTest_1 object
  18. dtype: object

一、数值型空值的比较

取数值大于2或小于等于2的行:

  1. print(arr[arr['numTest']>2])
  2. print(arr[arr['numTest']<=2])

输出结果为:

  1. numTest timeTest strTest strTest_1
  2. 3 3.0 NaT three three
  3. 5 4.0 2020-08-10 NaN nan
  4. numTest timeTest strTest strTest_1
  5. 0 1.0 2017-08-10 one one
  6. 1 2.0 2018-08-10 two two

我们发现,实际上是有六行的,但是能够进行大小比较的只有四行,空值不能参与比较!!!!这一点在过滤数据时要格外地注意,因为取数区间不对时可能会造成大量的数据损失!!!!在取建模样本时要尤其注意。

二、时间型空值的比较

当前时间是2018-08-21,那么分别取时间在今天之前和今天之后的行,代码如下:

  1. #因为本身时间格式已经定了,所以把当前时间也格式化成统一形式了
  2. print(arr[arr['timeTest']>time.strftime("%Y-%m-%d", time.localtime())])
  3. print(arr[arr['timeTest']<=time.strftime("%Y-%m-%d", time.localtime())])

结果:

  1. numTest timeTest strTest strTest_1
  2. 2 NaN 2019-08-10 NaN nan
  3. 5 4.0 2020-08-10 NaN nan
  4. numTest timeTest strTest strTest_1
  5. 0 1.0 2017-08-10 one one
  6. 1 2.0 2018-08-10 two two

和数值型空值一样,时间型空值也不参与大小比较,要尤其注意。

三、数值型空值的计算

用数值型的列通过逻辑运算产生新的列:

  1. arr['numTest_minus'] = arr['numTest']-1
  2. print(arr)

结果:

  1. numTest timeTest strTest strTest_1 numTest_minus
  2. 0 1.0 2017-08-10 one one 0.0
  3. 1 2.0 2018-08-10 two two 1.0
  4. 2 NaN 2019-08-10 NaN nan NaN
  5. 3 3.0 NaT three three 2.0
  6. 4 NaN NaT four four NaN
  7. 5 4.0 2020-08-10 NaN nan 3.0

空值与任何数值计算,均为空值。

四、时间型空值运算

计算时间差:

  1. arr['timeTest_minus'] = arr['timeTest']-pd.to_datetime('2018-08-21')
  2. #直接相减获得的列中会包含days字符串,要通过days属性取其天数
  3. arr['timeTest_minus'] = arr['timeTest_minus'].apply(lambda x:x.days)
  4. print(arr)

结果:

  1. numTest timeTest strTest strTest_1 timeTest_minus
  2. 0 1.0 2017-08-10 one one -376.0
  3. 1 2.0 2018-08-10 two two -11.0
  4. 2 NaN 2019-08-10 NaN nan 354.0
  5. 3 3.0 NaT three three NaN
  6. 4 NaN NaT four four NaN
  7. 5 4.0 2020-08-10 NaN nan 720.0

新生成的DataFrame类型如下:

  1. numTest float64
  2. timeTest datetime64[ns]
  3. strTest object
  4. strTest_1 object
  5. timeTest_minus float64
  6. dtype: object

由结果可知,NaT不参与时间运算,运算结果随新的列的类型变化而更改,比如这里就从NaT变成了NaN。

五、Oracle中的空值比较和运算

Oracle中进行比较时,空值默认是最大的,因此在进行分组比较时要格外注意,如果是用分析函数,最好是用is not null把空值排除在外,或者在分析函数中规定over(partition by order by nulls last/first),规定空值在最前或最后,根据自己的需求来定,否则取数结果中可能会无端端多很多空值。

Oracle中空值运算时和pandas中一样,和任何值做任何运算都为空。

发表评论

表情:
评论列表 (有 0 条评论,199人围观)

还没有评论,来说两句吧...

相关阅读