首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python处理疫情数据(城市编码缺失补全),让你的pandas跟上你的数据思维

Python处理疫情数据(城市编码缺失补全),让你的pandas跟上你的数据思维

作者头像
咋咋
发布2021-09-01 14:47:18
发布2021-09-01 14:47:18
1.3K0
举报
文章被收录于专栏:数据大宇宙数据大宇宙

> 经常听别人说 Python 在数据领域有多厉害,结果学了很长时间,连数据处理都麻烦得要死。后来才发现,原来不是 Python 数据处理厉害,而是他有数据分析神器—— pandas

# 前言

有人说,用 pandas 做数据分析真的很方便,但是,总会有人反对,我们也不浪费时间讨论这无聊的问题。今天我们拿着疫情数据,看看怎样用 pandas 发现问题和解决问题。而持有反对意见的小伙伴,不妨用你最拿手的工具尝试按照本文的思路完成需求。

本文是我为准备 pandas 专栏的案例时摘录的一些小技巧应用,如果你希望完整学习所有相关知识,请关注我的 pandas 专栏

# 数据来源

数据取自 github 项目 BlankerL/DXY-COVID-19-Crawler 的其中一份 csv 地区疫情统计数据,实际上这个项目只是定时到丁香园网站上爬取某个时刻的数据。

数据大致如下:

- 一行记录表示,某时间点(updateTime)某地区(cityName)的各项疫情指标

- 由于网站上显示的是当前最新累计数据,因此本数据的统计指标同样是累计数值

面对几万行多列的数据,应该先干什么呢?当然看看数据整体情况。

---

# 数据报告

我们直接使用基于 pandas 的一个快速数据报告库 pandas_profiling。如果没有安装,cmd 执行如下指令:

```shell

pip install pandas_profiling

```

先导入必须的包:

加载数据:

生成报告:

- 我是在 jupyter notebook 上直接显示报告,你也可以输出到单独的网页文件,用浏览器打开即可查看

---

实际可以从报告中发现很多这份数据的问题,不过本文我们只关注"省份和城市编码的问题"。

打开"变量页面",点开"**provinceName**",可以看到此字段的统计信息:

- 32个唯一值

- 没有缺失数据

- 同样的操作,我们发现字段"**province_zipCode**" 和 "**cityName**" 都没有缺失值

但是,当看到"**city_zipCode**" 时,却发现问题了:

- 有1266个缺失值

- 存在特殊的值,例如:-1,0

可能你会说,我们可以直接使用"cityName"做后续的数据分析需求。

如果你这么想,那么后面将会发现大坑,不管你后续的数据可视化,分析报告做得多么漂亮,源头数据都错误了,一切都白费。

---

# 城市名的问题

为什么不直接使用城市名字?因为城市名字是可能改变的,这源自于数据是从网站上爬取。

看看如下数据你就明白:

- 可以看到,"杨浦"和"杨浦区"实际是同一个地区,名字却从某时刻开始改变了

- 更严重的是,"杨浦"的城市编码是空的!

- 如果使用"cityName"进行处理,结果就认为有2个区,并且数据还会翻倍(因为数据指标都是累计数)。

现在,我们应该要怀疑这里的数据是否有其他的问题。那么怎样的逻辑才能验证城市编码是正确的:

- 同一个省的同一个城市,应该只有一个唯一编码,并且编码不为空

怎么验证?

---

# 找出有问题的数据

处理很3步:

- 省名字+城市名+城市编码,去除重复(这是因为此数据同一个城市的数据在同一天会被记录多次)

- 按 省名字+城市名 分组,那些组中超过1条记录的,就是有问题的记录

看看代码:

- 行4:去重复

- 行5:分组

- 行6:取出多于1条记录的组

一看吓一跳,即使不是空的编码,竟然存在同一个名字不同编码的数据。怎么解决这个问题?

---

那就取出每个城市中最大的编码作为该城市的编码吧:

- 行6:取出 city_zipCode 列的最大值

- 现在结果已经是每个城市只保留一条记录了

但是,这只是解决了一半的问题,现在仍然有那些空编码的城市:

- 有62行呀!

---

# 自动找最相似的名字

这是一个代表性的例子:

首先我们需要一个方法,用来判断2个文本的相似度:

剩下的思路就很简单了:

- 每个存在缺失城市编码的城市,到所属省份中的每个城市名字中,进行上述的相似度输出,然后取最大的作为匹配

你打算用 Python 自己撸这个逻辑?代码多、容易错、还执行慢!

直接来看看 pandas 的解决方式:

- 行2:缺失编码的行

- 行3:存在编码的行

- 行5:把2个表,按省份关联。关联后的结果,相当于每个缺失编码的城市与同省份的其他城市配对起来

- 行6-8:用左表的城市名(cityName_x) 与 右表的城市名(cityName_y) 执行相似度方法 city_diff_rate

- 行11:按 省份+缺失表的城市名 分组,取相似度最大记录的索引

- 行12:取出记录

直接输出到 Excel 看看:

- 看最右边的列,是相似度。可以看到,高相似度的行的匹配结果是对的

- 而最低的几个相似度的结果中,大概只有上面红框的4行记录不知道对不对。这个后面再探究

- 这太好了,62个缺失编码,我们只需要用手工处理5个

> 你可能会注意到,缺失编码的记录是62行,但我们的匹配结果是61行,这是因为 merge 的时候使用了 内连接,而那条记录是 澳门地区,他整个记录中只有一个地区,同时缺失编码

---

# 最后

关于这个城市编码补全的工作剩下的步骤:

- 把整个省份城市编码表整理出来

- 手工填补 4 行未知记录以及澳门地区的 1 行记录

- 后续处理分析工作基于整理的编码表进行

下一篇,将教你怎么快速把累计数据变成每天变化数据。敬请关注!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档