用Python进行数据分析项目实战之福布斯系列文章,目前已发布的相关文章如下:

  1. 福布斯系列之数据分析思路篇

  2. 福布斯系列之数据采集

  3. 福布斯系列之数据完整性检查 | Python数据分析项目实战

  4. 福布斯系列之补充数据收集 | Python数据分析项目实战

  5. 福布斯系列之数据清洗(1) | Python数据分析项目实战

  6. 福布斯系列之数据清洗(2) | Python数据分析项目实战

  7. Pandas数据处理实战:福布斯全球上市企业排行榜数据整理


1 前言

本文作为 数据清洗的第三篇,内容包含福布斯全球上市企业2000强排行榜数据中 2011-2015年 数据的初步处理过程。

福布斯全球上市企业2000强排行榜数据,从2007年到2017年,各个年份的数据都存在一些不规范的地方。

本文以2013年为例,描述2011年至2015年的数据清洗过程。

本项目运行环境:

  • windows7

  • jupyter notebook

  • Python 3.5

2 数据清洗的目的

将不规范的数据进行处理,包括:

  1. 检查数据完整性

  2. 去除重复内容

  3. 替换NaN值

  4. 将字符串型数字转换为数字类型

  5. 将数字后面多余的字母等文字剔除

  6. 将公司和国家进行拆分

  7. 按列名将DataFrame重新排序

最终达到的效果如下:

数据清洗后

数据类型

Year               int64Rank               int64Company_cn_en     objectCompany_en        objectCompany_cn        objectCountry_cn_en     objectCountry_cn        objectCountry_en        objectIndustry_cn       objectIndustry_en       objectSales            float64Profits          float64Assets           float64Market_value     float64dtype: object

图1:

3 2013年数据清洗的详细过程

导入相关python库

import pandas as pdimport numpy as np

2013年的数据,由于初始爬取的数据不完整,后续又查找了另外2个数据源,所以共有3个数据源,下面分别介绍。

3.1 数据源1

从csv文件中读取数据

df_2013 = pd.read_csv('./data/data_forbes_2013.csv', encoding='gbk',header=None)print('the shape of DataFrame: ', df_2013.shape)print(df_2013.dtypes)df_2013.head()out:the shape of DataFrame:  (1991, 9)

数据源1中,2013年的数据只有1991条记录,数据可能有缺失,待进一步核实。

3.2 数据源2

2013年的数据在网上继续寻找,发现Economy Watch网站有相关数据,于是进行数据爬取。前文《福布斯系列之补充数据收集 | Python数据分析项目实战》已描述了从该网站获取数据的过程。

从csv文件中读取数据

df_2013_economy = pd.read_csv('./data/data_forbes_2013_economywatch.csv', encoding='gbk')print('the shape of DataFrame: ', df_2013_economy.shape)print(df_2013_economy.dtypes)df_2013_economy.head()out:the shape of DataFrame:  (1984, 7)

发现数据只有1984条记录,也缺少相关记录,需要继续寻找其他记录。

3.3 数据源3

后来,找到一个excel文件,发现其数据记录是完整的,于是用该文件。

首先,从csv文件中读取数据

df_2013_all = pd.read_excel('./data/data_forbes_2013_all.xlsx')print('the shape of DataFrame: ', df_2013_all.shape)print(df_2013_all.dtypes)df_2013_all.head()out:the shape of DataFrame:  (2000, 7)排名           int64公司名         object国家(地区)      object销售额(亿美元)     int64利润(亿美元)      int64资产(亿美元)      int64市值(亿美元)      int64dtype: object

这里在前面两篇数据清洗文章的基础上,将数据清洗的过程整合到一起了。处理过程如下:

# 更新列名df_2013_all.columns = ['Rank', 'Company_cn_en',                   'Country_cn', 'Sales', 'Profits', 'Assets', 'Market_value']# 拆分"Company_cn_en"列,新生成两列,分别为公司英文名称和中文名称df_2013_all['Company_cn'],df_2013_all['Company_en'] = df_2013_all['Company_cn_en'].str.split('/', 1).str# print(df_2013_all['Company_cn'][:5])# print(df_2013_all['Company_en'] [-5:])# 将数据单位转换成十亿美元df_2013_all[['Sales','Profits','Assets','Market_value']] =df_2013_all[['Sales','Profits','Assets','Market_value']].apply(lambda x: x/10)# 添加年份2013df_2013_all['Year'] = 2013# 添加空白列df_2013_all['Country_en'],df_2013_all['Country_cn_en'], df_2013_all['Industry_cn'], df_2013_all['Industry_en'] = ['','','','']df_2013_all['Rank'] = pd.to_numeric(df_2013_all['Rank'])# 按指定list重新将columns进行排序df_2013_all = df_2013_all.reindex(columns=columns_sort)print(df_2013_all.shape)print(df_2013_all.dtypes)df_2013_all.head()

请注意,2013年的数据,sales、Profits、Assets及Market_value列的本身就是为数字类型,不需要进一步处理。

4 2015年的个别情况

在前文《福布斯系列之数据完整性检查 | Python数据分析项目实战》提到,2015年的企业数量有重复的,因此,在数据处理过程中,需要剔除重复的内容。

去重的代码如下:

# 数据有2020行,有重复行,需要去除重复行# inplace=True,使去重生效df_2015.drop_duplicates('Company_cn_en', inplace=True)

查看是否还有重复的内容:

# 查看'Company_cn_en'是否还有重复行df_2015[df_2015['Company_cn_en'].duplicated()]

通过查看结果可知,已无重复内容。

2015年的其他处理过程与2013年类似,就不做进一步描述了。

5 总结

2011年至2015年的数据,相互之间的相似度较高,数据清洗与处理过程和2013年的基本类似,具体过程就不再详细描述了(提供源代码供参考)。

2011年-2015年的数据, Sales、Profits、Assets及Market_value列的本身就是数字类型,可以在后续分析时计算使用,所以不需要像2008-2010年的数据那样处理。

结合前文2007年-2010年的数据清洗,将2007-2015年的数据清洗的代码合并到一起,感兴趣的同学可以回复关键字获取相关代码。

细心的同学可能会发现,本次依然没有提到针对国家数据的规整,因为国家数据的规整将统一到最后进行处理,敬请后续关注。

公众号后台回复"2017038",获取本文的源代码及原始数据文件。


如果您喜欢我的文章,欢迎转发(据说转发的同学更有气质哦),哈~~

推荐阅读:

  • 【工具】精华文章推荐-V1 | Python数据之道

  • Pandas: 如何将一列中的文本拆分为多行?

  • 2017年上半年过去了,你读了多少本书?


©著作权归作者所有:来自51CTO博客作者mb5fe18e7c44408的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 福布斯系列之数据清洗(2) | Python数据分析项目实战
  2. 福布斯系列之补充数据收集 | Python数据分析项目实战
  3. 福布斯系列之数据完整性检查 | Python数据分析项目实战
  4. 福布斯系列之数据清洗(1) | Python数据分析项目实战
  5. 想做疫情分析却没有数据?看这篇就够了
  6. LeetCode数据库篇|181超过经理收入的员工
  7. 实战|Python数据分析可视化并打包
  8. LeetCode数据库篇|175组合两个表
  9. 一道Leetcode数据库题的三种解法|文末送书

随机推荐

  1. Python数据结构:神奇的序列
  2. 遇到喷子,请先别急于反驳!
  3. 一份电商数据分析案例
  4. 怎样绘制漂亮的统计图表|不一样的折线图
  5. C#基础入门第十三天(多态接口)
  6. 【51CTO博客最全】2021阿里Java后端面试
  7. 一款优秀的 SDK 接口设计十大原则
  8. 是谁扼杀了我们好奇心?
  9. 让图形变得精致:seaborn绘图基础
  10. Android(安卓)Intent的几种用法总结