首頁 >後端開發 >Python教學 >Pandas資料處理實例展示:全球上市公司資料整理

Pandas資料處理實例展示:全球上市公司資料整理

巴扎黑
巴扎黑原創
2017-07-22 11:39:263496瀏覽

手頭上現在有一份福布斯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', ''))/1000df_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()

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

以上是Pandas資料處理實例展示:全球上市公司資料整理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:csv2mysql下一篇:csv2mysql