Pandas數(shù)據(jù)處理實(shí)戰(zhàn):福布斯全球上市企業(yè)排行榜數(shù)據(jù)整理

手頭現(xiàn)在有一份福布斯2016年全球上市企業(yè)2000強(qiáng)排行榜的數(shù)據(jù),但原始數(shù)據(jù)并不規(guī)范焰檩,需要處理后才能進(jìn)一步使用。

本文通過(guò)實(shí)例操作來(lái)介紹用pandas進(jìn)行數(shù)據(jù)整理。

照例先說(shuō)下我的運(yùn)行環(huán)境堰燎,如下:

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

在拿到原始數(shù)據(jù)后笋轨,我們先來(lái)看看數(shù)據(jù)的情況秆剪,并思考下我們需要什么樣的數(shù)據(jù)結(jié)果。

下面是原始數(shù)據(jù):

在本文中爵政,我們需要以下的初步結(jié)果仅讽,以供以后繼續(xù)使用。

可以看到钾挟,原始數(shù)據(jù)中洁灵,跟企業(yè)相關(guān)的數(shù)據(jù)中(“Sales”,“Profits”掺出,“Assets”徽千,“Market_value”)苫费,目前都是不是可以用來(lái)計(jì)算的數(shù)字類型。

原始內(nèi)容中包含貨幣符號(hào)”$“双抽,“-”百框,純字母組成的字符串以及其他一些我們認(rèn)為異常的信息。更重要的是牍汹,這些數(shù)據(jù)的單位并不一致铐维。分別有以“B”(Billion,十億)和“M”(Million柑贞,百萬(wàn))表示的方椎。在后續(xù)計(jì)算之前需要進(jìn)行單位統(tǒng)一。

1 處理方法 Method-1

首先想到的處理思路就是將數(shù)據(jù)信息分別按十億('B')和百萬(wàn)('M')進(jìn)行拆分钧嘶,分別進(jìn)行處理棠众,最后在合并到一起。過(guò)程如下所示有决。

  • 加載數(shù)據(jù)闸拿,并添加列的名稱
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')的數(shù)據(jù)
# 數(shù)據(jù)單位為 B的數(shù)據(jù)(Billion,十億)
df_2016_b = df_2016[df_2016['Sales'].str.endswith('B')]
print(df_2016_b.shape)
df_2016_b
  • 獲取單位為百萬(wàn)('M')的數(shù)據(jù)
# 數(shù)據(jù)單位為 M的數(shù)據(jù)(Million书幕,百萬(wàn))
df_2016_m = df_2016[df_2016['Sales'].str.endswith('M')]
print(df_2016_m.shape)
df_2016_m

這種方法理解起來(lái)比較簡(jiǎn)單新荤,但操作起來(lái)會(huì)比較繁瑣,尤其是如果有很多列數(shù)據(jù)需要處理的話台汇,會(huì)花費(fèi)很多時(shí)間苛骨。

進(jìn)一步的處理,我這里就不描述了苟呐。當(dāng)然痒芝,各位可以試試這個(gè)方法。

下面介紹稍微簡(jiǎn)單一點(diǎn)的方法牵素。

2 處理方法 Method-2

2.1 加載數(shù)據(jù)

第一步還是加載數(shù)據(jù)严衬,跟Method-1是一樣的。

下面來(lái)處理'Sales'列

2.2 替換相關(guān)的異常字符

首先是替換相關(guān)的異常字符笆呆,包括美元的貨幣符號(hào)'$'请琳,純字母的字符串'undefined',以及'B'赠幕。 這里俄精,我們想統(tǒng)一把數(shù)據(jù)的單位整理成十億,所以'B'可以直接進(jìn)行替換榕堰。而'M'需要更多的處理步驟嘀倒。

2.3 處理'M'相關(guān)的數(shù)據(jù)

處理含有百萬(wàn)“M”為單位的數(shù)據(jù),即以“M”結(jié)尾的數(shù)據(jù),思路如下:

(1)設(shè)定查找條件mask测蘑;

(2)替換字符串“M”為空值

(3)用pd.to_numeric()轉(zhuǎn)換為數(shù)字

(4)除以1000,轉(zhuǎn)換為十億美元康二,與其他行的數(shù)據(jù)一致

上面兩個(gè)步驟相關(guān)的代碼如下:

# 替換美元符號(hào)
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]+$','')

# 替換符號(hào)十億美元“B”為空白,數(shù)字本身代表的就是十億美元為單位
df_2016['Sales'] = df_2016['Sales'].str.replace('B','')


# 處理含有百萬(wàn)“M”為單位的數(shù)據(jù)沫勿,即以“M”結(jié)尾的數(shù)據(jù)
# 思路:
# (1)設(shè)定查找條件mask挨约;
# (2)替換字符串“M”為空值
# (3)用pd.to_numeric()轉(zhuǎn)換為數(shù)字
# (4)除以1000,轉(zhuǎn)換為十億美元产雹,與其他行的數(shù)據(jù)一致
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)

用同樣類似的方法處理其他列

可以看到诫惭,這個(gè)方法比第一種方法還是要方便很多。當(dāng)然蔓挖,這個(gè)方法針對(duì)DataFrame的每列數(shù)據(jù)都要進(jìn)行相關(guān)的操作夕土,如果列數(shù)多了,也還是比較繁瑣的瘟判。

有沒(méi)有更方便一點(diǎn)的方法呢怨绣。 答案是有的。

3 處理方法 Method-3

在Method-2的基礎(chǔ)上拷获,將處理方法寫(xiě)成更通用的數(shù)據(jù)處理函數(shù)篮撑,根據(jù)數(shù)據(jù)的結(jié)構(gòu),拓展更多的適用性匆瓜,則可以比較方便的處理相關(guān)數(shù)據(jù)赢笨。

3.1 加載數(shù)據(jù)

第一步還是加載數(shù)據(jù),跟Method-1是一樣的驮吱。

3.2 編寫(xiě)數(shù)據(jù)處理的自定義函數(shù)

參考Method-2的處理過(guò)程茧妒,編寫(xiě)數(shù)據(jù)處理的自定義函數(shù)'pro_col',并在Method-2的基礎(chǔ)上拓展其他替換功能糠馆,使之適用于這四列數(shù)據(jù)(“Sales”嘶伟,“Profits”,“Assets”又碌,“Market_value”)九昧。

函數(shù)編寫(xiě)的代碼如下:

def pro_col(df, col):   
    # 替換相關(guān)字符串,如有更多的替換情形毕匀,可以自行添加
    df[col] = df[col].str.replace('$','')
    df[col] = df[col].str.replace('^[A-Za-z]+$','')
    df[col] = df[col].str.replace('B','')

    # 注意這里是'-$'铸鹰,即以'-'結(jié)尾,而不是'-'皂岔,因?yàn)橛胸?fù)數(shù)
    df[col] = df[col].str.replace('-$','')
    df[col] = df[col].str.replace(',','')

    # 處理含有百萬(wàn)“M”為單位的數(shù)據(jù)蹋笼,即以“M”結(jié)尾的數(shù)據(jù)
    # 思路:
    # (1)設(shè)定查找條件mask;
    # (2)替換字符串“M”為空值
    # (3)用pd.to_numeric()轉(zhuǎn)換為數(shù)字
    # (4)除以1000,轉(zhuǎn)換為十億美元剖毯,與其他行的數(shù)據(jù)一致
    mask = df[col].str.endswith('M')
    df.loc[mask, col] = pd.to_numeric(df.loc[mask, col].str.replace('M',''))/1000

    # 將字符型的數(shù)字轉(zhuǎn)換為數(shù)字類型
    df[col] = pd.to_numeric(df[col])
    return df

3.3 將自定義函數(shù)進(jìn)行應(yīng)用

針對(duì)DataFrame的每列圾笨,應(yīng)用該自定義函數(shù),進(jìn)行數(shù)據(jù)處理逊谋,得到需要的結(jié)果擂达。

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()

當(dāng)然,如果DataFrame的列數(shù)特別多胶滋,可以用for循環(huán)板鬓,這樣代碼更簡(jiǎn)潔。代碼如下:

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()

最終處理后究恤,獲得的數(shù)據(jù)結(jié)果如下:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俭令,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子部宿,更是在濱河造成了極大的恐慌抄腔,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窟赏,死亡現(xiàn)場(chǎng)離奇詭異妓柜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)涯穷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)棍掐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拷况,你說(shuō)我怎么就攤上這事作煌。” “怎么了赚瘦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵粟誓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我起意,道長(zhǎng)鹰服,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任揽咕,我火速辦了婚禮悲酷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘亲善。我一直安慰自己设易,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布蛹头。 她就那樣靜靜地躺著顿肺,像睡著了一般戏溺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屠尊,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天旷祸,我揣著相機(jī)與錄音,去河邊找鬼讼昆。 笑死肋僧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的控淡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼止潘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掺炭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起凭戴,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涧狮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后么夫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體者冤,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年档痪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涉枫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腐螟,死狀恐怖愿汰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乐纸,我是刑警寧澤衬廷,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站汽绢,受9級(jí)特大地震影響吗跋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宁昭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一跌宛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧久窟,春花似錦秩冈、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丹锹。三九已至,卻和暖如春芬失,著一層夾襖步出監(jiān)牢的瞬間楣黍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工棱烂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留租漂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓颊糜,卻偏偏與公主長(zhǎng)得像哩治,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衬鱼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容