美文网首页我爱编程
Python编程&数据科学入门 Lesson5

Python编程&数据科学入门 Lesson5

作者: 进步小小青年 | 来源:发表于2017-08-24 23:24 被阅读0次

    第五课 - 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

    相关文章

      网友评论

        本文标题:Python编程&数据科学入门 Lesson5

        本文链接:https://www.haomeiwen.com/subject/ktqydxtx.html