10套练习,教你如何用Pandas做数据分析【1-5】

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行内容

# 运行以下代码

chipo.head(10)

out[235]:

步骤6 数据集中有多少个列(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 数据集的索引是怎样的

# 运行以下代码

chipo.index

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 这一列

# 运行以下代码

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 该数据集中一共有多少列(columns)?

# 运行以下代码

euro12.info()

步骤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 找到英格兰(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 np

import 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)的数据类型是什么样的?

# 运行以下代码

crime.info()

注意到了吗,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'] = population

crimes

out[278]:

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

# 运行以下代码

crime.idxmax(0)

out[279]:


练习5-合并

探索虚拟姓名数据

相应数据集:练习中手动内置的数据

步骤1 导入必要的库

# 运行以下代码

import numpy as np

import 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

# 运行以下代码

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]:

转载本文请联系 科赛网kesci.com 取得授权。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342