Pandas是入门Python做数据分析所必须要掌握的一个库,本文精选了十套练习题,帮助读者上手Python代码,完成数据集探索。
本文内容由科赛网翻译整理自Github,建议读者完成科赛网 从零上手Python关键代码 和 Pandas基础命令速查表 教程学习的之后,再对本教程代码进行调试学习。
【小提示:本文所使用的数据集下载地址:DATA | TRAIN 练习数据集】
练习1-开始了解你的数据
探索Chipotle快餐数据
相应数据集:chipotle.tsv

步骤1 导入必要的库
# 运行以下代码import pandas as pd
步骤2 从如下地址导入数据集
# 运行以下代码path1 = "../input/pandas_exercise/exercise_data/chipotle.tsv" # chipotle.tsv
步骤3 将数据集存入一个名为chipo的数据框内
# 运行以下代码chipo = pd.read_csv(path1, sep = '\t')
步骤4 查看前10行内容
out[235]:

步骤6 数据集中有多少个列(columns)
out[236]:
5
步骤7 打印出全部的列名称
out[237]:
Index([‘order_id’, ‘quantity’, ‘item_name’, ‘choice_description’, ‘item_price’], dtype=’object’)
步骤8 数据集的索引是怎样的
out[238]:
RangeIndex(start=0, stop=4622, step=1)
步骤9 被下单数最多商品(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中,下单次数最多的商品是什么?
# 运行以下代码,存在一些小问题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转换为浮点数
# 运行以下代码dollarizer = lambda x: float(x[1:-1])chipo['item_price'] = chipo['item_price'].apply(dollarizer)
步骤14 在该数据集对应的时期内,收入(revenue)是多少
# 运行以下代码,已经做更正chipo['sub_total'] = round(chipo['item_price'] * chipo['quantity'],2)chipo['sub_total'].sum()
out[244]:
39237.02
步骤15 在该数据集对应的时期内,一共有多少订单?
# 运行以下代码chipo['order_id'].nunique()
out[245]:
1834
步骤16 每一单(order)对应的平均总价是多少?
# 运行以下代码,已经做过更正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-数据过滤与排序
探索2012欧洲杯数据
相应数据集:Euro2012_stats.csv

步骤1 - 导入必要的库
# 运行以下代码import pandas as pd
步骤2 - 从以下地址导入数据集
# 运行以下代码path2 = "../input/pandas_exercise/exercise_data/Euro2012_stats.csv" # Euro2012_stats.csv
步骤3 - 将数据集命名为euro12
# 运行以下代码euro12 = pd.read_csv(path2)euro12
out[250]:

步骤4 只选取 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欧洲杯?
out[252]:
16
步骤6 该数据集中一共有多少列(columns)?

步骤7 将数据集中的列Team, Yellow Cards和Red Cards单独存为一个名叫discipline的数据框
# 运行以下代码discipline = euro12[['Team', 'Yellow Cards', 'Red Cards']]discipline
out[254]:

步骤8 对数据框discipline按照先Red Cards再Yellow Cards进行排序
# 运行以下代码discipline.sort_values(['Red Cards', 'Yellow Cards'], ascending = False)
out[255]:

步骤9 计算每个球队拿到的黄牌数的平均值
# 运行以下代码round(discipline['Yellow Cards'].mean())
out[256]:
7.0
步骤10 找到进球数Goals超过6的球队数据
# 运行以下代码euro12[euro12.Goals > 6]
out[257]:

步骤11 选取以字母G开头的球队数据
# 运行以下代码euro12[euro12.Team.str.startswith('G')]
out[258]:

步骤12 选取前7列
# 运行以下代码euro12.iloc[: , 0:7]
out[259]:

步骤13 选取除了最后3列之外的全部列
# 运行以下代码euro12.iloc[: , :-3]
out[260]:

步骤14 找到英格兰(England)、意大利(Italy)和俄罗斯(Russia)的射正率(Shooting Accuracy)
# 运行以下代码euro12.loc[euro12.Team.isin(['England', 'Italy', 'Russia']), ['Team','Shooting Accuracy']]
out[261]:

练习3-数据分组
探索酒类消费数据
相应数据集:drinks.csv

步骤1 导入必要的库
# 运行以下代码import pandas as pd
步骤2 从以下地址导入数据
# 运行以下代码path3 ='../input/pandas_exercise/exercise_data/drinks.csv' #'drinks.csv'
步骤3 将数据框命名为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)的描述性统计值
# 运行以下代码drinks.groupby('continent').wine_servings.describe()
out[266]:

步骤6 打印出每个大陆每种酒类别的消耗平均值
# 运行以下代码drinks.groupby('continent').mean()
out[267]:

步骤7 打印出每个大陆每种酒类别的消耗中位数
# 运行以下代码drinks.groupby('continent').median()
out[268]:

步骤8 打印出每个大陆对spirit饮品消耗的平均值,最大值和最小值
# 运行以下代码drinks.groupby('continent').spirit_servings.agg(['mean', 'min', 'max'])
out[269]:

练习4-Apply函数
探索1960-2014美国犯罪数据
相应数据集:US_Crime_Rates_1960_2014.csv

步骤1 导入必要的库
# 运行以下代码import numpy as npimport pandas as pd
步骤2 从以下地址导入数据集
# 运行以下代码path4 = '../input/pandas_exercise/exercise_data/US_Crime_Rates_1960_2014.csv' # "US_Crime_Rates_1960_2014.csv"
步骤3 将数据框命名为crime
# 运行以下代码crime = pd.read_csv(path4)crime.head()
out[272]:

步骤4 每一列(column)的数据类型是什么样的?

注意到了吗,Year的数据类型为int64,但是pandas有一个不同的数据类型去处理时间序列(time series),我们现在来看看。
步骤5 将Year的数据类型转换为 datetime64
# 运行以下代码crime.Year = pd.to_datetime(crime.Year, format='%Y')crime.info()

步骤6 将列Year设置为数据框的索引
# 运行以下代码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对数据框进行分组并求和
注意Population这一列,若直接对其求和,是不正确的*
# 更多关于 .resample 的介绍# (https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.resample.html)# 更多关于 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'] = populationcrimes
out[278]:

步骤9 何时是美国历史上生存最危险的年代?
out[279]:

练习5-合并
探索虚拟姓名数据
相应数据集:练习中手动内置的数据
步骤1 导入必要的库
# 运行以下代码import numpy as npimport pandas as pd
步骤2 按照如下的元数据内容创建数据框
# 运行以下代码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 将上述的数据框分别命名为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两个数据框按照行的维度进行合并,命名为all_data
# 运行以下代码all_data = pd.concat([data1, data2])all_data
out[283]:

步骤5 将data1和data2两个数据框按照列的维度进行合并,命名为all_data_col
# 运行以下代码all_data_col = pd.concat([data1, data2], axis = 1)all_data_col
out[284]:

步骤6 打印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 合并之后的所有匹配结果
# 运行以下代码pd.merge(data1, data2, on='subject_id', how='outer')
out[288]:

转载本文请联系和鲸社区取得授权。
由于内容过多,以免导致篇幅过大而导致读者阅读不顺畅,练习5至练习10将会放在下期发布。
