Pandas數據處理實戰:福布斯全球上市企業排行榜數據整理

来源:http://www.cnblogs.com/lemonbit/archive/2017/07/10/7147154.html
-Advertisement-
Play Games

手頭現在有一份福布斯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()

最終處理後,獲得的數據結果如下:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 題目描述 在幻想鄉,上白澤慧音是以知識淵博聞名的老師。春雪異變導致人間之里的很多道路都被大雪堵塞,使有的學生不能順利地到達慧音所在的村莊。因此慧音決定換一個能夠聚集最多人數的村莊作為新的教學地點。人間之里由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. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...