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

手头现在有一份福布斯2016年全球上市企业2000强排行榜的数据,但原始数据并不规范,需要处理后才能进一步使用。

本文通过实例操作来介绍用pandas进行数据整理。

照例先说下我的运行环境,如下:

  • windows 7, 64位
  • python 3.5
  • pandas 0.19.2版本

在拿到原始数据后,我们先来看看数据的情况,并思考下我们需要什么样的数据结果。

下面是原始数据:

在本文中,我们需要以下的初步结果,以供以后继续使用。

可以看到,原始数据中,跟企业相关的数据中(“Sales”,“Profits”,“Assets”,“Market_value”),目前都是不是可以用来计算的数字类型。

原始内容中包含货币符号”$“,“-”,纯字母组成的字符串以及其他一些我们认为异常的信息。更重要的是,这些数据的单位并不一致。分别有以“B”(Billion,十亿)和“M”(Million,百万)表示的。在后续计算之前需要进行单位统一。

1 处理方法 Method-1

首先想到的处理思路就是将数据信息分别按十亿(’B’)和百万(‘M’)进行拆分,分别进行处理,最后在合并到一起。过程如下所示。

  • 加载数据,并添加列的名称
import pandas as pd

df_2016 = pd.read_csv(‘data_2016.csv‘, encoding=‘gbk‘,header=None)

# 更新列名
df_2016.columns = [‘Year‘, ‘Rank‘, ‘Company_cn‘,‘Company_en‘,
                   ‘Country_en‘, ‘Sales‘, ‘Profits‘, ‘Assets‘, ‘Market_value‘]

print(‘the shape of DataFrame: ‘, df_2016.shape)
print(df_2016.dtypes)
df_2016.head(3)
  • 获取单位为十亿(’B’)的数据
# 数据单位为 B的数据(Billion,十亿)
df_2016_b = df_2016[df_2016[‘Sales‘].str.endswith(‘B‘)]
print(df_2016_b.shape)
df_2016_b
  • 获取单位为百万(‘M’)的数据
# 数据单位为 M的数据(Million,百万)
df_2016_m = df_2016[df_2016[‘Sales‘].str.endswith(‘M‘)]
print(df_2016_m.shape)
df_2016_m

这种方法理解起来比较简单,但操作起来会比较繁琐,尤其是如果有很多列数据需要处理的话,会花费很多时间。

进一步的处理,我这里就不描述了。当然,各位可以试试这个方法。

下面介绍稍微简单一点的方法。

2 处理方法 Method-2

2.1 加载数据

第一步还是加载数据,跟Method-1是一样的。

下面来处理’Sales’列

2.2 替换相关的异常字符

首先是替换相关的异常字符,包括美元的货币符号’$’,纯字母的字符串’undefined’,以及’B’。 这里,我们想统一把数据的单位整理成十亿,所以’B’可以直接进行替换。而’M’需要更多的处理步骤。

2.3 处理’M’相关的数据

处理含有百万“M”为单位的数据,即以“M”结尾的数据,思路如下:

(1)设定查找条件mask;

(2)替换字符串“M”为空值

(3)用pd.to_numeric()转换为数字

(4)除以1000,转换为十亿美元,与其他行的数据一致

上面两个步骤相关的代码如下:

# 替换美元符号
df_2016[‘Sales‘] = df_2016[‘Sales‘].str.replace(‘$‘,‘‘)

# # 查看异常值,均为字母(“undefined”)
# df_2016[df_2016[‘Sales‘].str.isalpha()]

# 替换异常值“undefined”为空白
# df_2016[‘Sales‘] = df_2016[‘Sales‘].str.replace(‘undefined‘,‘‘)
df_2016[‘Sales‘] = df_2016[‘Sales‘].str.replace(‘^[A-Za-z]+$‘,‘‘)

# 替换符号十亿美元“B”为空白,数字本身代表的就是十亿美元为单位
df_2016[‘Sales‘] = df_2016[‘Sales‘].str.replace(‘B‘,‘‘)

# 处理含有百万“M”为单位的数据,即以“M”结尾的数据
# 思路:
# (1)设定查找条件mask;
# (2)替换字符串“M”为空值
# (3)用pd.to_numeric()转换为数字
# (4)除以1000,转换为十亿美元,与其他行的数据一致
mask = df_2016[‘Sales‘].str.endswith(‘M‘)
df_2016.loc[mask, ‘Sales‘] = pd.to_numeric(df_2016.loc[mask, ‘Sales‘].str.replace(‘M‘, ‘‘))/1000

df_2016[‘Sales‘] = pd.to_numeric(df_2016[‘Sales‘])
print(‘the shape of DataFrame: ‘, df_2016.shape)
print(df_2016.dtypes)
df_2016.head(3)

用同样类似的方法处理其他列

可以看到,这个方法比第一种方法还是要方便很多。当然,这个方法针对DataFrame的每列数据都要进行相关的操作,如果列数多了,也还是比较繁琐的。

有没有更方便一点的方法呢。 答案是有的。

插播一条硬广:技术文章转发太多。文章来自微信公众号“Python数据之道”(ID:PyDataRoad)。

3 处理方法 Method-3

在Method-2的基础上,将处理方法写成更通用的数据处理函数,根据数据的结构,拓展更多的适用性,则可以比较方便的处理相关数据。

3.1 加载数据

第一步还是加载数据,跟Method-1是一样的。

3.2 编写数据处理的自定义函数

参考Method-2的处理过程,编写数据处理的自定义函数’pro_col’,并在Method-2的基础上拓展其他替换功能,使之适用于这四列数据(“Sales”,“Profits”,“Assets”,“Market_value”)。

函数编写的代码如下:

def pro_col(df, col):
    # 替换相关字符串,如有更多的替换情形,可以自行添加
    df[col] = df[col].str.replace(‘$‘,‘‘)
    df[col] = df[col].str.replace(‘^[A-Za-z]+$‘,‘‘)
    df[col] = df[col].str.replace(‘B‘,‘‘)

    # 注意这里是‘-$‘,即以‘-‘结尾,而不是‘-‘,因为有负数
    df[col] = df[col].str.replace(‘-$‘,‘‘)
    df[col] = df[col].str.replace(‘,‘,‘‘)

    # 处理含有百万“M”为单位的数据,即以“M”结尾的数据
    # 思路:
    # (1)设定查找条件mask;
    # (2)替换字符串“M”为空值
    # (3)用pd.to_numeric()转换为数字
    # (4)除以1000,转换为十亿美元,与其他行的数据一致
    mask = df[col].str.endswith(‘M‘)
    df.loc[mask, col] = pd.to_numeric(df.loc[mask, col].str.replace(‘M‘,‘‘))/1000

    # 将字符型的数字转换为数字类型
    df[col] = pd.to_numeric(df[col])
    return df

3.3 将自定义函数进行应用

针对DataFrame的每列,应用该自定义函数,进行数据处理,得到需要的结果。

pro_col(df_2016, ‘Sales‘)
pro_col(df_2016, ‘Profits‘)
pro_col(df_2016, ‘Assets‘)
pro_col(df_2016, ‘Market_value‘)

print(‘the shape of DataFrame: ‘, df_2016.shape)
print(df_2016.dtypes)
df_2016.head()

当然,如果DataFrame的列数特别多,可以用for循环,这样代码更简洁。代码如下:

cols = [‘Sales‘, ‘Profits‘, ‘Assets‘, ‘Market_value‘]
for col in cols:
    pro_col(df_2016, col)

print(‘the shape of DataFrame: ‘, df_2016.shape)
print(df_2016.dtypes)
df_2016.head()

最终处理后,获得的数据结果如下:

?

时间: 2024-10-02 06:38:38

Pandas数据处理实战:福布斯全球上市企业排行榜数据整理的相关文章

2014福布斯全球最具价值品牌榜,苹果稳坐榜首

摘要:近日福布斯网站发布全球最具价值前100品牌榜单,苹果以1242亿美元稳拿第一,微软.谷歌分别以630亿美元.566亿美元紧随其后. 本次评选苹果以1242亿美元成为福布斯历史上价值最高的品牌,是其他曾获得过最具价值品牌殊荣公司的两倍,苹果品牌价值比去年同期增长19%.细数苹果在过去的13年中的强大的品牌和革命性,重新定义了iPhone.iPad.iPod和iTunes 4个产品类别,Apple Watch和Apple Pay的陆续推出,其品牌溢价将苹果的营业利润推高了33%,使得苹果9月份

Python项目实战:福布斯系列之数据采集

1 数据采集概述 开始一个数据分析项目,首先需要做的就是get到原始数据,获得原始数据的方法有多种途径.比如: 获取数据集(dataset)文件 使用爬虫采集数据 直接获得excel.csv及其他数据文件 其他途径… 本次福布斯系列数据分析项目实战,数据采集方面,主要数据来源于使用爬虫进行数据采集,同时也辅助其他数据进行对比. 本文主要是介绍使用爬虫进行数据采集的思路和步骤. 本次采集的福布斯全球上市企业2000强排行榜数据,涉及年份从2007年到2017年,跨越10多年. 本次采集的目标网站,

SWUSTOJ福布斯富豪榜(0273)

福布斯富豪榜(0273) 1917年创立的福布斯杂志,在编制各种排行榜方面有86年历史,1982年首次推出富豪榜在全球产生空前影响,现在,一年一度的福布斯全球亿万富翁榜在全世界受到密切关注.福布斯每年编制一百多个有关人物.公司和生活时尚排行榜,在全球范围内,福布斯富豪榜的江湖地位毋庸置疑.他云集了世界各地的富豪们. Description 有多组测试数据,少于10. 每组数据两个数N (0 < N < = 10^6)和K ( 0< K <= 10 ,K < N ),表示有N位

福布斯专访阿里蔡崇信:马云的坚持和改变

http://tech.sina.com.cn/i/2014-01-13/18219092718.shtml 蔡崇信(左)和马云(右) 导语:阿里巴巴集团董事局执行副主席蔡崇信上周接受了<福布斯>杂志专访,他回顾了加盟阿里巴巴15年来的心路历程,并坦言马云在公司管理方面有很大进步. 1999年,蔡崇信赶赴杭州拜访马云,当时阿里巴巴还是一家鲜为人知的创业公司,其创始人马云同样名气不大.在这次拜访之前的四年里,蔡崇信一直在香港工作,是瑞典投资公司Investor AB的高管.这次拜访后,蔡崇信主动

Lync 项目经验-12-为某上市企业Skype for Business购买Godday证书

<要想看Lync 2013升级SFB 2015真实项目经验:请看Lync 项目经验-01-到-Lync 项目经验-10> 本系列博文: Lync 项目经验-01-共存迁移-Lync2013-TO-SFB 2015-规划01http://dynamic.blog.51cto.com/711418/1858520 Lync 项目经验-02-共存迁移-Lync2013-TO-SFB 2015-规划02http://dynamic.blog.51cto.com/711418/1859143 Lync

2015年福布斯中国名人榜

2015年福布斯中国名人榜 编辑 2016年10月11日,福布斯中文版发布2015年福布斯中国名人榜,范冰冰摘得桂冠,周杰伦位第二,谢霆锋居第三. 2016年100位入选名人的总收入达38.2亿元(人民币),人均年收入3823万元,与2015年相比下降了11.4%. 中文名 2016年福布斯中国名人榜 外文名 In 2015 Forbes list of Chinese celebrities 发布日期 2016年10月11日 发布机构 福布斯公司 目录 1 评选标准 2 完整榜单 3 榜单分析

《福布斯》评苹果——是一家生态系统公司

据国外媒体报道,苹果在昨日的全球开发者会议上未发布任何硬件产品.此举让部分媒体和专栏作家感到不安,并由此展开讨论.苹果究竟是一家硬件公司,还是一家软件公司?<福布斯>周二发表评论文指出--苹果事实上是一家生态系统公司. 以下为<福布斯>评论文译文内容: 有关苹果究竟是硬件公司还是软件公司的争论,在过去相当一段时间里一直存在着.苹果的批评者们总喜欢将其描述成一家以硬件设备为主的公司,并反复强调其竞争优势将随着对手的发展和新品的不断推出,而变得遥遥欲坠. 然而许多年过去了,苹果的竞争优

Lync 项目经验-13-为某上市企业仅安装Skype for Business 2016(图解)

****************************************************************************** <Skype for Business Server 2015-项目实战>(免费系列规划.部署博文) http://dynamic.blog.51cto.com/711418/1655481 **************************************************************************

福布斯:1月底百度有望晋级“千亿俱乐部”

福布斯近日发表文章<百度2015仍将高歌猛进>,文章预测百度股价至1月底有望增长15%,每股超过270美元,市值达到千亿美元.“即便如此,这对这家中国搜索引擎巨头来说,还只是旅程的开始.” 文章指出,在快速增长的互联网市场中,百度搜索份额高达80%.不仅如此,考虑到中国互联网覆盖率仍不足50%——相比之下美国为78%,但中国 人口数量是美国的4倍——中国潜在用户数量实际上可能比美国总人口还要多.这意味着这家公司未来五年将继续享受人口红利,无需为增长率发愁. 当前,百度股价在上涨区间底部震荡,未