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