第五课 - 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
我们可以通过index选项添加自定义的行标签(label)
使用column选项可以选择列的顺序
&gdp_df = pd.DataFrame(gdp, columns = ["country", "capital", "population", "gdp", "continent"], index = ["us", "cn", "jp", "de", "uk"])
输出:gdp_df
也可以使用index和columns直接修改
* gdp_df.index = ["US", "CN", "JP", "DE", "UK"]
* gdp_df.columns = ["Country", "Capital", "Population", "GDP", "Continent"]
输出:gdp_df
增加一列数据
* 增加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
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
* 当我们使用 # 点操作符 # 来查看一个变量时,返回的是一个pandas series
* 在后续的布尔筛选中使用点方法可以简化代码
* US,...,UK是索引
例 2 . gdp_df.GDP
输出:
例 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的布尔索引中会大量使用
输出:
例 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
03. 数据的选择
- df [ [ ‘conlum_name’] ] ——选取列,生成DataFrame格式数据
- df [ ‘conlum_name’ ] ——选取列,生成series格式数据
- df. conlum_name——生成series格式数据
- df [2:5](使用一对方括弧,但里面是数值切片索引)——生成行索引
- df.loc——使用行和列的标签索引选取数据(行和列都是放在列表中)
- df.iloc——使用行和列的数值索引选取数据(行和列都是放在列表中)
- 使用布尔索引筛选数据
例 1. gdp_df [["Country"]] ——# 使用变量名加[[]]选取列
输出:
例 2. gdp_df[["Country", "GDP"]]_# 可以同时选取多列
输出:
例 3. type(gdp_df["Country"])_#如果只是用[ ]则产生series
输出:pandas.core.series.Series
例 4. gdp_df.Country_# 使用句点符号也能获取某一列的Series
输出:
例 5.gdp_df[2:5]
- 终索引是不被包括的!
- 行选取和2d数组类似
-
如果使用 [ ] 选取行,切片方法唯一的选项
输出:
loc方法
- 是一种基于 行标签和列标签 选取数据的方法
- 可以选取特定行或列,也可以同时指定所需要的行与列
- 和二维numpy array的格式非常类似
例 1.gdp_df.loc[["JP","DE"]]
- 在上面例子中,我们使用行索引选取行,能不能使用行标签实现选取呢?
-
loc方法正是基于标签选取数据的方法
输出:
例 2.gdp_df.loc[["JP","DE"],["Country", "GDP", "Continent"]]
- 以上例子选取了所有的列
-
我们可以加入需要的列标签
输出:
例 3.gdp_df.loc[:, ["Country", "GDP", "Continent"]]
-
选取所有的行,我们可以使用 : 来表示选取所有的行
输出:
iloc方法
- 和loc方法不同的地方是,iloc是基于行列索引进行数据选择而不是标签
- 具体使用方法和loc类似,用行/列索引代替标签
例 1.gdp_df.iloc[[2,3]]
-
等价于gdp_df.loc[["JP","DE"]]
输出:
例2.gdp_df.loc[["JP","DE"],["Country", "GDP", "Continent"]]
等价于=gdp_df.iloc[[2,3],[0,3,4]]
输出:
例 3.gdp_df.iloc[:, [0,3,4]]
等价于gdp_df.loc[:, ["country", "GDP", "continent"]]
输出:
使用布尔索引(boolean Indexing)筛选数据
- 我们可以使用pandas series来获取一个boolean series
- 布尔索引的使用和二维numpy array类似
- 可以结合 [ ] 或者loc一起使用
例 1.gdp_df[gdp_df.Continent == "Asia"]
-
选出亚洲国家,下面两行命令产生一样的结果
输出:
例 2.gdp_df.loc[gdp_df.Continent == "Asia"]
例 3.gdp_df [ ( gdp_df.Continent == "Europe") & (gdp_df.GDP > 3 ) ]
输出:
- 选出gdp大于3兆亿美元的欧洲国家
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行数据
输出:
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()
方法二:使用 .loc[ ]
petal = iris.loc[:, ['petal_length', 'petal_width']]
输出:petal.head()
方法三:使用 .iloc[ ]
petal = iris.iloc[:, 2:4]
输出:petal.head()
例2:选取行索引为5-10的数据行
方法一:使用 [ ]
iris[5:11]
输出:
方法二:使用 .iloc[]
iris.iloc[5:11, :]
输出:
例3:选取品种为 Iris-versicolor 的数据
versicolor = iris[iris.species == 'Iris-versicolor']
versicolor.head()
输出: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>
使用布尔索引的方法分别获取三个品种的数据
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>