空值填充技巧(上)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 空值填充技巧(上)

在使用数据过程中,我们常常会遇到NULL值,对于NULL的存在,你们是否在乎呢?

常见的场景:使用Excel进行合并单元格的数据时,将他们录入数据库或者加载到PowerBI,合并单元格的数据只显示一行有数据,其它则显示NULL,这种情况需要对数据空值进行填充,才能真正用于可视化和报表开发;

如果未处理,则可视化可能会出现下面情况:

实际场景:有这样一份关于企业用户数的每天记录,但由于系统原因常常出现有些天企业用户数没有进行统计,测试数据如下:

create table wechat
(
    date1 date,    
    num   int);
insert into wechat values ('2022-07-01', 5),       
                          ('2022-07-02', 6),       
                          ('2022-07-03', null),       
                          ('2022-07-04', 7),       
                          ('2022-07-05', null),       
                          ('2022-07-06', null),       
                          ('2022-07-07', 8),       
                          ('2022-07-08', null),       
                          ('2022-07-09', null),       
                          ('2022-07-10', null),       
                          ('2022-07-11', 9);

针对于这些没有统计的日期,进行补0不太正常,企业用户数也不太可能一下子减为0,所以客户希望可以根据最近一天的用户数进行填充。

需求分析:客户希望根据最近一天的用户数进行填充NULL值,那么这样的话就有两种情况,根据前一天向下填充用户数和后一天向上填充用户数,我们知道Power Query在功能栏上可以直接点击实现,那如何在SQL和Python中进行实现呢?

Mysql 实现向下或向上填充

count(字段):统计不为NULL的记录数;

在这里小编巧妙的运用了count(column) 和开窗函数结合,这样就计算出了累计不为NULL的记录数,然后根据记录数进行分组,取组内最大值进行填充,这样便解决了问题;

由于Mysql窗口函数不太支持添加 ignore nulls ,这里采用了子查询方式处理,如果有需要小编也可以准备一份Oracle的处理方式哦!

select date1,
       num,
       max(num) over (partition by a) num_next, -- 向下填充
       max(num) over (partition by b) num_up    -- 向上填充
from (select date1,
             num,
             count(num) over w1 a,              -- 向下累计不为null的记录数
             count(num) over w2 b               -- 向上累计不为null的记录数
      from wechat
          window w1 as (order by date1),
              w2 as (order by date1 desc)) t
order by date1;
data1 num num_next num_up
2022-07-01 5 5 5
2022-07-02 6 6 6
2022-07-03 6 7
2022-07-04 7 7 7
2022-07-05 7 8
2022-07-06 7 8
2022-07-07 8 8 8
2022-07-08 8 9
2022-07-09 8 9
2022-07-10 8 9
2022-07-11 9 9 9

Python 实现向下或向上填充

对于空值的处理Python有专门的fillna函数处理,有兴趣的同学可以去官网进行查阅:fillna语法

在这里我们进行了简单的使用:

  • method=‘ffill’ 使用前一个不为空的值填充
  • method=‘bfill’ 使用后一个不为空的值填充
# 导入所需要的模块
import pandas as pd
from sqlalchemy import create_engine
# 与本地数据库建立连接
engine = create_engine(str(r'mysql+pymysql://%s:' '%s' '@%s/%s' '?charset=UTF8MB4')%('root', '1q2w3e4r', '127.0.0.1', 'test'))
# 获取测试数据
sql1 = " select * from wechat "
data1 = pd.read_sql_query(sql1,engine)
### 以上是测试数据在Mysql数据库中的获取方法,也可直接读取CSV文件如下 ###
# 直接读取CSV文件测试数据
data1 = pd.read_csv('/Users/guanfawang/Desktop/test.csv')
# 向下填充
data1.insert(loc=2,column='num_next',value=data1['num'].fillna(method='ffill'))
# 向上填充
data1.insert(loc=3,column='num_up',value=data1['num'].fillna(method='bfill'))
data1
data1 num num_next num_up
2022-07-01 5 5 5
2022-07-02 6 6 6
2022-07-03 6 7
2022-07-04 7 7 7
2022-07-05 7 8
2022-07-06 7 8
2022-07-07 8 8 8
2022-07-08 8 9
2022-07-09 8 9
2022-07-10 8 9
2022-07-11 9 9 9

总结

在实际应用中,出现NULL值我们一定要特别注意,避免后面开发报表出现新的问题,所以建议尽早发现NULL,并且及时沟通商量应对方案,以上是针对不同工具实现的填充,还有更高阶的填充呢方案,我将会在后期给大家分享,记得关注哦!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
23天前
表格数据填充方法单元格数据填充
表格数据填充方法单元格数据填充【10月更文挑战第22天】
27 2
|
24天前
如何设置条件格式以填充颜色?
【10月更文挑战第21天】如何设置条件格式以填充颜色?
40 2
|
6月前
|
Python
dataframe循环更新某列的值
使用Python的for循环和Pandas DataFrame的iterrows()方法可更新DataFrame列值。示例中创建新列'D',其值为旧列'C'的一半。
135 2
|
6月前
今天Mibatis遇到的空值
今天Mibatis遇到的空值
24 0
|
前端开发
Bootstrap - 列排序,列偏移,列嵌套
Bootstrap - 列排序,列偏移,列嵌套
98 0
nullish(空值合并)运算符
nullish(空值合并)运算符
288 1
Panda处理CSV文件,如果A列值为空,则用B列值填充,如果B列值仍为空,用C列值填充A
Panda处理CSV文件,如果A列值为空,则用B列值填充,如果B列值仍为空,用C列值填充A
126.设置填充类型和填充颜色
126.设置填充类型和填充颜色
88 0
|
开发者 索引
Javscript数组快速填充数据的8种方法
Javscript数组快速填充数据的8种方法
222 0
for...of 返回索引和值
for...of 返回索引和值