10套練習杯拐,教你如何用Pandas做數(shù)據(jù)分析【1-5】

Pandas是入門Python做數(shù)據(jù)分析所必須要掌握的一個庫霞篡,本文精選了十套練習題,幫助讀者上手Python代碼藕施,完成數(shù)據(jù)集探索寇损。

本文內(nèi)容由科賽網(wǎng)翻譯整理自Github,建議讀者完成科賽網(wǎng)?從零上手Python關(guān)鍵代碼?和?Pandas基礎(chǔ)命令速查表?教程學習的之后裳食,再對本教程代碼進行調(diào)試學習。

【小提示:本文所使用的數(shù)據(jù)集下載地址:DATA | TRAIN 練習數(shù)據(jù)集


練習1-開始了解你的數(shù)據(jù)

探索Chipotle快餐數(shù)據(jù)

相應數(shù)據(jù)集:chipotle.tsv

步驟1 導入必要的庫

# 運行以下代碼

import pandas as pd

步驟2 從如下地址導入數(shù)據(jù)集

# 運行以下代碼

path1 = "../input/pandas_exercise/exercise_data/chipotle.tsv"? ? # chipotle.tsv

步驟3 將數(shù)據(jù)集存入一個名為chipo的數(shù)據(jù)框內(nèi)

# 運行以下代碼

chipo = pd.read_csv(path1, sep = '\t')

步驟4 查看前10行內(nèi)容

# 運行以下代碼

chipo.head(10)

out[235]:

步驟6 數(shù)據(jù)集中有多少個列(columns)

# 運行以下代碼

chipo.shape[1]

out[236]:

5

步驟7 打印出全部的列名稱

# 運行以下代碼

chipo.columns

out[237]:

Index(['order_id', 'quantity', 'item_name', 'choice_description', 'item_price'], dtype='object')

步驟8 數(shù)據(jù)集的索引是怎樣的

# 運行以下代碼

chipo.index

out[238]:

RangeIndex(start=0, stop=4622, step=1)

步驟9 被下單數(shù)最多商品(item)是什么?

# 運行以下代碼芙沥,做了修正

c = chipo[['item_name','quantity']].groupby(['item_name'],as_index=False).agg({'quantity':sum})

c.sort_values(['quantity'],ascending=False,inplace=True)

c.head()

out[239]:

步驟10 在item_name這一列中诲祸,一共有多少種商品被下單?

# 運行以下代碼

chipo['item_name'].nunique()

out[240]:

50

步驟11 在choice_description中而昨,下單次數(shù)最多的商品是什么救氯?

# 運行以下代碼,存在一些小問題

chipo['choice_description'].value_counts().head()

out[241]:

[Diet Coke] 134

[Coke] 123

[Sprite] 77

[Fresh Tomato Salsa, [Rice, Black Beans, Cheese, Sour Cream, Lettuce]] 42

[Fresh Tomato Salsa, [Rice, Black Beans, Cheese, Sour Cream, Guacamole, Lettuce]] 40

Name: choice_description, dtype: int64

步驟12 一共有多少商品被下單歌憨?

# 運行以下代碼

total_items_orders = chipo['quantity'].sum()

total_items_orders

out[242]:

4972

步驟13 將item_price轉(zhuǎn)換為浮點數(shù)

# 運行以下代碼

dollarizer = lambda x: float(x[1:-1])

chipo['item_price'] = chipo['item_price'].apply(dollarizer)

步驟14 在該數(shù)據(jù)集對應的時期內(nèi)着憨,收入(revenue)是多少

# 運行以下代碼,已經(jīng)做更正

chipo['sub_total'] = round(chipo['item_price'] * chipo['quantity'],2)

chipo['sub_total'].sum()

out[244]:

39237.02

步驟15 在該數(shù)據(jù)集對應的時期內(nèi),一共有多少訂單务嫡?

# 運行以下代碼

chipo['order_id'].nunique()

out[245]:

1834

步驟16 每一單(order)對應的平均總價是多少甲抖?

# 運行以下代碼,已經(jīng)做過更正

chipo[['order_id','sub_total']].groupby(by=['order_id']

).agg({'sub_total':'sum'})['sub_total'].mean()

out[246]:

21.39423118865867

步驟17 一共有多少種不同的商品被售出心铃?

# 運行以下代碼

chipo['item_name'].nunique()

out[247]:

50


練習2-數(shù)據(jù)過濾與排序

探索2012歐洲杯數(shù)據(jù)

相應數(shù)據(jù)集:Euro2012_stats.csv

步驟1 - 導入必要的庫

# 運行以下代碼

import pandas as pd

步驟2 - 從以下地址導入數(shù)據(jù)集

# 運行以下代碼

path2 = "../input/pandas_exercise/exercise_data/Euro2012_stats.csv"? ? ? # Euro2012_stats.csv

步驟3 - 將數(shù)據(jù)集命名為euro12

# 運行以下代碼

euro12 = pd.read_csv(path2)

euro12

out[250]:

步驟4 只選取?Goals?這一列

# 運行以下代碼

euro12.Goals

out[251]:

0 4

1 4

2 4

3 5

4 3

5 10

6 5

7 6

8 2

9 2

10 6

11 1

12 5

13 12

14 5

15 2

Name: Goals, dtype: int64

步驟5 有多少球隊參與了2012歐洲杯准谚?

# 運行以下代碼

euro12.shape[0]

out[252]:

16

步驟6 該數(shù)據(jù)集中一共有多少列(columns)?

# 運行以下代碼

euro12.info()

步驟7 將數(shù)據(jù)集中的列Team, Yellow Cards和Red Cards單獨存為一個名叫discipline的數(shù)據(jù)框

# 運行以下代碼

discipline = euro12[['Team', 'Yellow Cards', 'Red Cards']]

discipline

out[254]:

步驟8 對數(shù)據(jù)框discipline按照先Red Cards再Yellow Cards進行排序

# 運行以下代碼

discipline.sort_values(['Red Cards', 'Yellow Cards'], ascending = False)

out[255]:

步驟9 計算每個球隊拿到的黃牌數(shù)的平均值

# 運行以下代碼

round(discipline['Yellow Cards'].mean())

out[256]:

7.0

步驟10 找到進球數(shù)Goals超過6的球隊數(shù)據(jù)

# 運行以下代碼

euro12[euro12.Goals > 6]

out[257]:

步驟11 選取以字母G開頭的球隊數(shù)據(jù)

# 運行以下代碼

euro12[euro12.Team.str.startswith('G')]

out[258]:

步驟12 找到英格蘭(England)、意大利(Italy)和俄羅斯(Russia)的射正率(Shooting Accuracy)

# 運行以下代碼

euro12.loc[euro12.Team.isin(['England', 'Italy', 'Russia']), ['Team','Shooting Accuracy']]

out[261]:


練習3-數(shù)據(jù)分組

探索酒類消費數(shù)據(jù)

相應數(shù)據(jù)集:drinks.csv

步驟1 導入必要的庫

# 運行以下代碼

import pandas as pd

步驟2 從以下地址導入數(shù)據(jù)

# 運行以下代碼

path3 ='../input/pandas_exercise/exercise_data/drinks.csv'? ? #'drinks.csv'

步驟3 將數(shù)據(jù)框命名為drinks

# 運行以下代碼

drinks = pd.read_csv(path3)

drinks.head()

out[264]:

步驟4 哪個大陸(continent)平均消耗的啤酒(beer)更多去扣?

# 運行以下代碼

drinks.groupby('continent').beer_servings.mean()

out[265]:

步驟5 打印出每個大陸(continent)的紅酒消耗(wine_servings)的描述性統(tǒng)計值

# 運行以下代碼

drinks.groupby('continent').wine_servings.describe()

out[266]:

步驟6 打印出每個大陸每種酒類別的消耗平均值

# 運行以下代碼

drinks.groupby('continent').mean()

out[267]:

步驟7 打印出每個大陸每種酒類別的消耗中位數(shù)

# 運行以下代碼

drinks.groupby('continent').median()

out[268]:

步驟8 打印出每個大陸對spirit飲品消耗的平均值柱衔,最大值和最小值

# 運行以下代碼

drinks.groupby('continent').spirit_servings.agg(['mean', 'min', 'max'])

out[269]:



練習4-Apply函數(shù)

探索1960-2014美國犯罪數(shù)據(jù)

相應數(shù)據(jù)集:US_Crime_Rates_1960_2014.csv

步驟1 導入必要的庫

# 運行以下代碼

import numpy as np

import pandas as pd

步驟2 從以下地址導入數(shù)據(jù)集

# 運行以下代碼

path4 = '../input/pandas_exercise/exercise_data/US_Crime_Rates_1960_2014.csv'? ? # "US_Crime_Rates_1960_2014.csv"

步驟3 將數(shù)據(jù)框命名為crime

# 運行以下代碼

crime = pd.read_csv(path4)

crime.head()

out[272]:

步驟4 每一列(column)的數(shù)據(jù)類型是什么樣的?

# 運行以下代碼

crime.info()

注意到了嗎愉棱,Year的數(shù)據(jù)類型為int64唆铐,但是pandas有一個不同的數(shù)據(jù)類型去處理時間序列(time series),我們現(xiàn)在來看看奔滑。

步驟5 將Year的數(shù)據(jù)類型轉(zhuǎn)換為?datetime64

# 運行以下代碼

crime.Year = pd.to_datetime(crime.Year, format='%Y')

crime.info()

步驟6 將列Year設(shè)置為數(shù)據(jù)框的索引

# 運行以下代碼

crime = crime.set_index('Year', drop = True)

crime.head()

out[275]:

步驟7 刪除名為Total的列

# 運行以下代碼

del crime['Total']

crime.head()

out[276]:

crime.resample('10AS').sum()

out[277]:

步驟8 按照Year對數(shù)據(jù)框進行分組并求和

*注意Population這一列艾岂,若直接對其求和,是不正確的**

# 更多關(guān)于 .resample 的介紹

# (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.resample.html)

# 更多關(guān)于 Offset Aliases的介紹

# (http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases)

# 運行以下代碼

crimes = crime.resample('10AS').sum() # resample a time series per decades

# 用resample去得到“Population”列的最大值

population = crime['Population'].resample('10AS').max()

# 更新 "Population"

crimes['Population'] = population

crimes

out[278]:

步驟9 何時是美國歷史上生存最危險的年代档押?

# 運行以下代碼

crime.idxmax(0)

out[279]:


練習5-合并

探索虛擬姓名數(shù)據(jù)

相應數(shù)據(jù)集:練習中手動內(nèi)置的數(shù)據(jù)

步驟1 導入必要的庫

# 運行以下代碼

import numpy as np

import pandas as pd

步驟2 按照如下的元數(shù)據(jù)內(nèi)容創(chuàng)建數(shù)據(jù)框

# 運行以下代碼

raw_data_1 = {

? ? ? ? 'subject_id': ['1', '2', '3', '4', '5'],

? ? ? ? 'first_name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'],

? ? ? ? 'last_name': ['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches']}

raw_data_2 = {

? ? ? ? 'subject_id': ['4', '5', '6', '7', '8'],

? ? ? ? 'first_name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'],

? ? ? ? 'last_name': ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan']}

raw_data_3 = {

? ? ? ? 'subject_id': ['1', '2', '3', '4', '5', '7', '8', '9', '10', '11'],

? ? ? ? 'test_id': [51, 15, 15, 61, 16, 14, 15, 1, 61, 16]}

步驟3 將上述的數(shù)據(jù)框分別命名為data1, data2, data3

# 運行以下代碼

data1 = pd.DataFrame(raw_data_1, columns = ['subject_id', 'first_name', 'last_name'])

data2 = pd.DataFrame(raw_data_2, columns = ['subject_id', 'first_name', 'last_name'])

data3 = pd.DataFrame(raw_data_3, columns = ['subject_id','test_id'])

步驟4 將data1和data2兩個數(shù)據(jù)框按照行的維度進行合并澳盐,命名為all_data

# 運行以下代碼

all_data = pd.concat([data1, data2])

all_data

out[283]:

步驟5 將data1和data2兩個數(shù)據(jù)框按照列的維度進行合并祈纯,命名為all_data_col

# 運行以下代碼

all_data_col = pd.concat([data1, data2], axis = 1)

all_data_col

out[284]:

步驟6 打印data3

# 運行以下代碼

data3

out[285]:

步驟7 按照subject_id的值對all_data和data3作合并

# 運行以下代碼

pd.merge(all_data, data3, on='subject_id')

out[286]:

步驟8 對data1和data2按照subject_id作連接

# 運行以下代碼

pd.merge(data1, data2, on='subject_id', how='inner')

out[287]:

步驟9 找到?data1?和?data2?合并之后的所有匹配結(jié)果

# 運行以下代碼

pd.merge(data1, data2, on='subject_id', how='outer')

out[288]:

轉(zhuǎn)載本文請聯(lián)系?科賽網(wǎng)kesci.com?取得授權(quán)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叼耙,一起剝皮案震驚了整個濱河市腕窥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筛婉,老刑警劉巖簇爆,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異爽撒,居然都是意外死亡入蛆,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門硕勿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哨毁,“玉大人,你說我怎么就攤上這事源武≡谒” “怎么了嵌溢?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵场斑,是天一觀的道長扩灯。 經(jīng)常有香客問我,道長闹究,這世上最難降的妖魔是什么幔崖? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮渣淤,結(jié)果婚禮上赏寇,老公的妹妹穿的比我還像新娘。我一直安慰自己砂代,他們只是感情好蹋订,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刻伊,像睡著了一般露戒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捶箱,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天智什,我揣著相機與錄音,去河邊找鬼丁屎。 笑死荠锭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的晨川。 我是一名探鬼主播证九,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼删豺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了愧怜?” 一聲冷哼從身側(cè)響起呀页,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拥坛,沒想到半個月后蓬蝶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡猜惋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年丸氛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片著摔。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡缓窜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梨撞,到底是詐尸還是另有隱情雹洗,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布卧波,位于F島的核電站,受9級特大地震影響庇茫,放射性物質(zhì)發(fā)生泄漏港粱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一旦签、第九天 我趴在偏房一處隱蔽的房頂上張望查坪。 院中可真熱鬧,春花似錦宁炫、人聲如沸偿曙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽望忆。三九已至,卻和暖如春竿秆,著一層夾襖步出監(jiān)牢的瞬間启摄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工幽钢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歉备,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓匪燕,卻偏偏與公主長得像蕾羊,于是被迫代替她去往敵國和親喧笔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361