Python编程&数据科学入门 Lesson5

第五课 - Pandas 入门

本课内容:

*01. pandas DataFrame(数据框)

*02. pandas Series

*03. 数据的选择

*04. 案例:Iris 鸢尾花数据

* 数据的导入和观察
* 数据选择复习
* 数据可视化初探

01. Pandas DataFrame(表格型数据结构)

我们存储数据最常用的形式是表格
  • 表格就是由行与列所构成的一种有序的组织形式
  • 表格的第一行一般是变量名称,也称为表头(header)
  • 不同的变量可以是不同的数据类型。
  • DataFrame含有一组有序的列,每列可以是不同是值类型(数值、字符串、布尔型等)
  • DataFrame既有行索引也有列索引
比如下面这个表格罗列了2016年GDP最高的5个国家以及对应的首都,人口(百万),GDP(万亿美元),和所在大洲
country capital population GDP continent
United States Washington, D.C. 323 19.42 North America
China Beijing 1389 11.8 Asia
Japan Tokyo 127 4.84 Asia
Germany Berlin 83 3.42 Europe
United Kingdom London 66 2.5 Europe

问题:如何在python中表示以上这个表格?

  • 在第四节课中,我们介绍了二维numpy array。但是numpy array只能存储一种数据类型,但是上面的表格同时有数值变量和字符串。
  • 我们需要使用pandas包来处理
    • pandas是数据科学中最常用的包之一,可以高效的处理各种数据格式。
    • pandas是基于numpy构建的
    • 我们将重点介绍pandas中的series和DataFrame

1.1 从字典创建一个DataFrame

  • 回忆第三节课程,我们需要键(key)和值(value)来定义一个字典
    gdp = {"country":["United States", "China", "Japan", "Germany", "United Kingdom"],
    "capital":["Washington, D.C.", "Beijing", "Tokyo", "Berlin", "London"],
    "population":[323, 1389, 127, 83, 66],
    "gdp":[19.42, 11.8, 4.84, 3.42, 2.5],
    "continent":["North America", "Asia", "Asia", "Europe", "Europe"]}
& import pandas as pd # 按惯例将pandas简称为pd
gdp_df = pd.DataFrame(gdp)
输出:gdp_df #列索引为第一行,行索引为0-4
Paste_Image.png
我们可以通过index选项添加自定义的行标签(label)
使用column选项可以选择列的顺序
&gdp_df = pd.DataFrame(gdp, columns = ["country", "capital", "population", "gdp", "continent"], index = ["us", "cn", "jp", "de", "uk"])

输出:gdp_df

Paste_Image.png
也可以使用index和columns直接修改
* gdp_df.index = ["US", "CN", "JP", "DE", "UK"]
* gdp_df.columns = ["Country", "Capital", "Population", "GDP", "Continent"]

输出:gdp_df

Paste_Image.png

增加一列数据

* 增加rank列,表示他们的GDP处在前5位

gdp_df["rank"] = "Top5 GDP"

* 增加国土面积变量,以百万公里计(数据来源:http://data.worldbank.org/

gdp_df["Area"] = [9.15, 9.38, 0.37, 0.35, 0.24]

输出:gdp_df

Paste_Image.png

02.Pandas series

  • pandas中的series对象是另一个重要的数据结构
  • 你可以将其视为一个一维的DataFrame或者一个一维数组(array)加上一个索引(index)
  • 在这节课后半部分,我们将展示series在数据过滤和分组运算中起到作用
例 1. series = pd.Series([2,4,5,7,3], index=['a','b','c','d','e']) # 一个最简单的series

输出:series # 默认的索引是0到4

Paste_Image.png
* 当我们使用 # 点操作符 # 来查看一个变量时,返回的是一个pandas series
* 在后续的布尔筛选中使用点方法可以简化代码
* US,...,UK是索引
例 2 . gdp_df.GDP

输出:


Paste_Image.png
例 3 . gdp_df.GDP.index —— # 可以直接查看索引index

输出:Index(['US', 'CN', 'JP', 'DE', 'UK'], dtype='object')

例 4 \ . type(gdp_df.GDP) ——# 类型是pandas.core.series.Series

输出:pandas.core.series.Series

例 5 . gdp_df.GDP > 4——#返回一个布尔型的series,在后面讲到的DataFrame的布尔索引中会大量使用

输出:


Paste_Image.png
例 5 \ .gdp_dict = {"US": 19.42, "CN": 11.80, "JP": 4.84, "DE": 3.42, "UK": 2.5}
gdp_series = pd.Series(gdp_dict)
——# 我们也可以将series视为一个长度固定且有顺序的字典,一些用于字典的函数也可以用于series

输出: gdp_series

Paste_Image.png

03. 数据的选择

  • df [ [ ‘conlum_name’] ] ——选取列,生成DataFrame格式数据
  • df [ ‘conlum_name’ ] ——选取列,生成series格式数据
  • df. conlum_name——生成series格式数据
  • df [2:5](使用一对方括弧,但里面是数值切片索引)——生成行索引
  • df.loc——使用行和列的标签索引选取数据(行和列都是放在列表中)
  • df.iloc——使用行和列的数值索引选取数据(行和列都是放在列表中)
  • 使用布尔索引筛选数据
例 1. gdp_df [["Country"]] ——# 使用变量名加[[]]选取列

输出:


Paste_Image.png
例 2. gdp_df[["Country", "GDP"]]_# 可以同时选取多列

输出:

Paste_Image.png
例 3. type(gdp_df["Country"])_#如果只是用[ ]则产生series

输出:pandas.core.series.Series

例 4. gdp_df.Country_# 使用句点符号也能获取某一列的Series

输出:


Paste_Image.png
例 5.gdp_df[2:5]
  • 终索引是不被包括的!
  • 行选取和2d数组类似
  • 如果使用 [ ] 选取行,切片方法唯一的选项
    输出:


    Paste_Image.png

loc方法

  • 是一种基于 行标签和列标签 选取数据的方法
  • 可以选取特定行或列,也可以同时指定所需要的行与列
  • 和二维numpy array的格式非常类似
例 1.gdp_df.loc[["JP","DE"]]
  • 在上面例子中,我们使用行索引选取行,能不能使用行标签实现选取呢?
  • loc方法正是基于标签选取数据的方法
    输出:


    Paste_Image.png
例 2.gdp_df.loc[["JP","DE"],["Country", "GDP", "Continent"]]
  • 以上例子选取了所有的列
  • 我们可以加入需要的列标签
    输出:


    Paste_Image.png
例 3.gdp_df.loc[:, ["Country", "GDP", "Continent"]]
  • 选取所有的行,我们可以使用 : 来表示选取所有的行
    输出:


    Paste_Image.png

iloc方法

  • 和loc方法不同的地方是,iloc是基于行列索引进行数据选择而不是标签
  • 具体使用方法和loc类似,用行/列索引代替标签
例 1.gdp_df.iloc[[2,3]]
  • 等价于gdp_df.loc[["JP","DE"]]
    输出:


    Paste_Image.png
例2.gdp_df.loc[["JP","DE"],["Country", "GDP", "Continent"]]
等价于=gdp_df.iloc[[2,3],[0,3,4]]

输出:


Paste_Image.png
例 3.gdp_df.iloc[:, [0,3,4]]
等价于gdp_df.loc[:, ["country", "GDP", "continent"]]

输出:


Paste_Image.png

使用布尔索引(boolean Indexing)筛选数据

  • 我们可以使用pandas series来获取一个boolean series
  • 布尔索引的使用和二维numpy array类似
  • 可以结合 [ ] 或者loc一起使用
例 1.gdp_df[gdp_df.Continent == "Asia"]
  • 选出亚洲国家,下面两行命令产生一样的结果
    输出:


    Paste_Image.png
例 2.gdp_df.loc[gdp_df.Continent == "Asia"]
Paste_Image.png
例 3.gdp_df [ ( gdp_df.Continent == "Europe") & (gdp_df.GDP > 3 ) ]

输出:

  • 选出gdp大于3兆亿美元的欧洲国家
Paste_Image.png

04.案例:Iris 鸢尾花数据

让我们来看一下经典的iris数据

  • 鸢尾花卉数据集, 来源 UCI 机器学习数据集
  • 四个特征被用作样本的定量分析,它们分别是花萼(sepal)和花瓣(petal)的长度(length)和宽度(width)

4.1数据的导入和观察

col_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
  • 用列表存储列标签
iris = pd.read_csv('iris.txt', names=col_names)
  • 读取数据,并指定每一列的标签
iris.head(10)
  • 使用head/tail查看数据的头和尾
  • 查看开头10行数据
    输出:


    Paste_Image.png
iris.info()
  • 使用info方法查看数据的总体信息
    输出:<class 'pandas.core.frame.DataFrame'>
    RangeIndex: 150 entries, 0 to 149
    Data columns (total 5 columns):
    sepal_length 150 non-null float64
    sepal_width 150 non-null float64
    petal_length 150 non-null float64
    petal_width 150 non-null float64
    species 150 non-null object
    dtypes: float64(4), object(1)
    memory usage: 5.9+ KB
iris.shape
  • 使用shape可以查看DataFrame的行数与列数
  • iris有150个观察值,5个变量
    输出:(150, 5)
iris.species.unique()
  • 这里的品种(species)是分类变量(categorical variable)
  • 可以使用unique方法来对查看series中品种的名字
    输出:array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object)
iris.species.value_counts()
  • 统计不同品种的数量
  • 使用DataFrame的value_counts方法来实现
    输出:
    Iris-setosa 50
    Iris-versicolor 50
    Iris-virginica 50
    Name: species, dtype: int64

4.2数据选择复习

例1:选取花瓣数据,即 petal_length 和 petal_width 这两列

方法一:使用[[ ]]
petal = iris[['petal_length', 'petal_width']]

输出:petal.head()

Paste_Image.png
方法二:使用 .loc[ ]
petal = iris.loc[:, ['petal_length', 'petal_width']]

输出:petal.head()

Paste_Image.png
方法三:使用 .iloc[ ]
petal = iris.iloc[:, 2:4]

输出:petal.head()

Paste_Image.png

例2:选取行索引为5-10的数据行

方法一:使用 [ ]

iris[5:11]

输出:


Paste_Image.png

方法二:使用 .iloc[]

iris.iloc[5:11, :]

输出:


Paste_Image.png

例3:选取品种为 Iris-versicolor 的数据

versicolor = iris[iris.species == 'Iris-versicolor']
versicolor.head()

输出:
Paste_Image.png

4.3数据可视化初探

  • 数据可视化一般是数据分析的第一步,让我们对数据有一个直观的了解。
  • 通过可视化,我们往往可以观察到一些规律,这些观察到的规律可以对后续的建模起到指导作用。
  • 可视化也是和非技术背景人沟通最有效的手段之一,不是所有人都懂得模型,但是大部分都可以理解图形

设置在notebook中直接展示图形输出

注意DataFrame也是基于matplotlib作图的

matplotlib inline

设置图片清晰度

config InlineBackend.figure_format = 'retina'

4.3.1散点图

我们首先画散点图(sactter plot),x轴上画出花瓣的长度,y轴上画出花瓣的宽度
我们观察到什么呢?

iris.plot(kind='scatter', x="petal_length", y="petal_width")

<matplotlib.axes._subplots.AxesSubplot at 0x11c0c7a90>

Paste_Image.png

使用布尔索引的方法分别获取三个品种的数据

setosa = iris[iris.species == 'Iris-setosa']
versicolor = iris[iris.species == 'Iris-versicolor']
virginica = iris[iris.species == 'Iris-virginica']

ax = setosa.plot(kind='scatter', x="petal_length", y="petal_width", color='Red', label='setosa', figsize=(10,6))
versicolor.plot(kind='scatter', x="petal_length", y="petal_width", color='Green', ax=ax, label='versicolor')
virginica.plot(kind='scatter', x="petal_length", y="petal_width", color='Orange', ax=ax, label='virginica')
<matplotlib.axes._subplots.AxesSubplot at 0x11e71b550>

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

推荐阅读更多精彩内容