查看原文
其他

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

LEMON Python数据之道 2022-04-24

用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重新排序

最终达到的效果如下:

数据清洗后

数据类型

  1. Year               int64

  2. Rank               int64

  3. Company_cn_en     object

  4. Company_en        object

  5. Company_cn        object

  6. Country_cn_en     object

  7. Country_cn        object

  8. Country_en        object

  9. Industry_cn       object

  10. Industry_en       object

  11. Sales            float64

  12. Profits          float64

  13. Assets           float64

  14. Market_value     float64

  15. dtype: object

图1:

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

导入相关python库

  1. import pandas as pd

  2. import numpy as np

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

3.1 数据源1

从csv文件中读取数据

  1. df_2013 = pd.read_csv('./data/data_forbes_2013.csv', encoding='gbk',header=None)

  2. print('the shape of DataFrame: ', df_2013.shape)

  3. print(df_2013.dtypes)

  4. df_2013.head()

  5. out:

  6. the shape of DataFrame:  (1991, 9)

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

3.2 数据源2

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

从csv文件中读取数据

  1. df_2013_economy = pd.read_csv('./data/data_forbes_2013_economywatch.csv', encoding='gbk')

  2. print('the shape of DataFrame: ', df_2013_economy.shape)

  3. print(df_2013_economy.dtypes)

  4. df_2013_economy.head()

  5. out:

  6. the shape of DataFrame:  (1984, 7)

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

3.3 数据源3

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

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

  1. df_2013_all = pd.read_excel('./data/data_forbes_2013_all.xlsx')

  2. print('the shape of DataFrame: ', df_2013_all.shape)

  3. print(df_2013_all.dtypes)

  4. df_2013_all.head()

  5. out:

  6. the shape of DataFrame:  (2000, 7)

  7. 排名           int64

  8. 公司名         object

  9. 国家(地区)      object

  10. 销售额(亿美元)     int64

  11. 利润(亿美元)      int64

  12. 资产(亿美元)      int64

  13. 市值(亿美元)      int64

  14. dtype: object

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

  1. # 更新列名

  2. df_2013_all.columns = ['Rank', 'Company_cn_en',

  3.                   'Country_cn', 'Sales', 'Profits', 'Assets', 'Market_value']

  4. # 拆分"Company_cn_en"列,新生成两列,分别为公司英文名称和中文名称

  5. df_2013_all['Company_cn'],df_2013_all['Company_en'] = df_2013_all['Company_cn_en'].str.split('/', 1).str

  6. # print(df_2013_all['Company_cn'][:5])

  7. # print(df_2013_all['Company_en'] [-5:])

  8. # 将数据单位转换成十亿美元

  9. df_2013_all[['Sales','Profits','Assets','Market_value']] =df_2013_all[['Sales','Profits','Assets','Market_value']].apply(lambda x: x/10)

  10. # 添加年份2013

  11. df_2013_all['Year'] = 2013

  12. # 添加空白列

  13. df_2013_all['Country_en'],df_2013_all['Country_cn_en'], df_2013_all['Industry_cn'], df_2013_all['Industry_en'] = ['','','','']

  14. df_2013_all['Rank'] = pd.to_numeric(df_2013_all['Rank'])

  15. # 按指定list重新将columns进行排序

  16. df_2013_all = df_2013_all.reindex(columns=columns_sort)

  17. print(df_2013_all.shape)

  18. print(df_2013_all.dtypes)

  19. df_2013_all.head()

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

4 2015年的个别情况

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

去重的代码如下:

  1. # 数据有2020行,有重复行,需要去除重复行

  2. # inplace=True,使去重生效

  3. df_2015.drop_duplicates('Company_cn_en', inplace=True)

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

  1. # 查看'Company_cn_en'是否还有重复行

  2. 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",获取本文的源代码及原始数据文件。


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

推荐阅读:

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存