手頭現在有一份福布斯2016年全球上市企業2000強排行榜的數據,但原始數據並不規範,需要處理後才能進一步使用。 本文通過實例操作來介紹用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()
最終處理後,獲得的數據結果如下:
-
題目描述 在幻想鄉,上白澤慧音是以知識淵博聞名的老師。春雪異變導致人間之里的很多道路都被大雪堵塞,使有的學生不能順利地到達慧音所在的村莊。因此慧音決定換一個能夠聚集最多人數的村莊作為新的教學地點。人間之里由N個村莊(編號為1..N)和M條道路組成,道路分為兩種一種為單向通行的,一種為雙向通行的,分別 ...
-
從資料庫表生成實體 從資料庫表生成實體 1. 由資料庫生成模型: php bin/console doctrine:mapping:convert --from-database yml D:\db\ D:\test_backend>php bin/console doctrine:mapping: ...
-
function Pinyin($_String, $_Code='UTF8'){ //GBK頁面可改為gb2312,其他隨意填寫為UTF8 $_DataKey = "a|ai|an|ang|ao|ba|bai|ban|bang|bao|bei|ben|beng|bi|bian|biao|bie|b ...
-
"當系統的每一部分都由最優解或相對優解組成,那麼系統最終也將是最完美的。" 這句話是在參加莫技術分享會上聽到的,這句話吸引我占在人群後面聽完了她的分享,確實受益良多。 本文也旨在描述自己在項目演變中對一處公共處理邏輯優化的過程,周期略長最近有時間整理如下。 業務系統數據傳遞過程中,會抽取一些公共的屬 ...
-
寫在前面: 用JDBC從資料庫中查詢數據要用到結果集ResultSet,其中我們在獲取結果的時候經常用到rs.next()方法來判斷是否查詢到了數據。 但是要特別註意,next()方法用一次,游標就往後移了一位,此時再使用next()來獲取結果就是結果集中的第二個記錄了。 舉例:這裡我就用偽代碼寫的 ...
-
7.用戶輸入輸出和while迴圈 1、使用函數input()輸入,print()列印,字元串可以用逗號隔開。end=‘ ’ 關鍵字參數,列印時可以不換行,sep=‘ 你想要的分隔符 ’ ,關鍵字參數,替換掉預設的分隔字元串。 2、輸入是Input,輸出是Output,因此,我們把輸入輸出統稱為Inp ...
-
一、定義一個類 第一種方法__init__()方法是一種特殊的方法,被稱為類的構造函數或初始化方法,當創建了這個類的實例時就會調用該方法 self 代表類的實例,self 在定義類的方法時是必須有的,雖然在調用時不必傳入相應的參數。 二、self代表的實例,而非類 類的方法與普通的函數只有一個特別的 ...
-
Java集合框架小應用之撲克牌小游戲 學習了Java集合框架之後,我寫了一個撲克牌小游戲來鞏固知識。學習之餘的練習之作,有不足之處還得多多指教了~(*/ω\*) 撲克牌小游戲背景: 1. 創建一副撲克牌,不考慮大小王 包括四種花色:黑桃、紅桃、梅花、方片 十三種點數:2-10,J Q K A 2. ...