第五課 - Pandas 入門
本課內(nèi)容:
*01. pandas DataFrame(數(shù)據(jù)框)
*02. pandas Series
*03. 數(shù)據(jù)的選擇
*04. 案例:Iris 鳶尾花數(shù)據(jù)
* 數(shù)據(jù)的導(dǎo)入和觀察
* 數(shù)據(jù)選擇復(fù)習(xí)
* 數(shù)據(jù)可視化初探
01. Pandas DataFrame(表格型數(shù)據(jù)結(jié)構(gòu))
我們存儲數(shù)據(jù)最常用的形式是表格
- 表格就是由行與列所構(gòu)成的一種有序的組織形式
- 表格的第一行一般是變量名稱,也稱為表頭(header)
- 不同的變量可以是不同的數(shù)據(jù)類型。
- DataFrame含有一組有序的列,每列可以是不同是值類型(數(shù)值、字符串、布爾型等)
- DataFrame既有行索引也有列索引
比如下面這個表格羅列了2016年GDP最高的5個國家以及對應(yīng)的首都,人口(百萬),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中表示以上這個表格?
- 在第四節(jié)課中,我們介紹了二維numpy array。但是numpy array只能存儲一種數(shù)據(jù)類型,但是上面的表格同時有數(shù)值變量和字符串。
- 我們需要使用pandas包來處理
- pandas是數(shù)據(jù)科學(xué)中最常用的包之一,可以高效的處理各種數(shù)據(jù)格式。
- pandas是基于numpy構(gòu)建的
- 我們將重點介紹pandas中的series和DataFrame
1.1 從字典創(chuàng)建一個DataFrame
- 回憶第三節(jié)課程,我們需要鍵(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選項添加自定義的行標(biāo)簽(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
增加一列數(shù)據(jù)
* 增加rank列,表示他們的GDP處在前5位
gdp_df["rank"] = "Top5 GDP"
* 增加國土面積變量,以百萬公里計(數(shù)據(jù)來源:http://data.worldbank.org/)
gdp_df["Area"] = [9.15, 9.38, 0.37, 0.35, 0.24]
輸出:gdp_df
02.Pandas series
- pandas中的series對象是另一個重要的數(shù)據(jù)結(jié)構(gòu)
- 你可以將其視為一個一維的DataFrame或者一個一維數(shù)組(array)加上一個索引(index)
- 在這節(jié)課后半部分,我們將展示series在數(shù)據(jù)過濾和分組運算中起到作用
例 1. series = pd.Series([2,4,5,7,3], index=['a','b','c','d','e']) # 一個最簡單的series
輸出:series # 默認(rèn)的索引是0到4
* 當(dāng)我們使用 # 點操作符 # 來查看一個變量時,返回的是一個pandas series
* 在后續(xù)的布爾篩選中使用點方法可以簡化代碼
* 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視為一個長度固定且有順序的字典,一些用于字典的函數(shù)也可以用于series
輸出: gdp_series
03. 數(shù)據(jù)的選擇
- df [ [ ‘conlum_name’] ] ——選取列,生成DataFrame格式數(shù)據(jù)
- df [ ‘conlum_name’ ] ——選取列,生成series格式數(shù)據(jù)
- df. conlum_name——生成series格式數(shù)據(jù)
- df [2:5](使用一對方括弧,但里面是數(shù)值切片索引)——生成行索引
- df.loc——使用行和列的標(biāo)簽索引選取數(shù)據(jù)(行和列都是放在列表中)
- df.iloc——使用行和列的數(shù)值索引選取數(shù)據(jù)(行和列都是放在列表中)
- 使用布爾索引篩選數(shù)據(jù)
例 1. gdp_df [["Country"]] ——# 使用變量名加[[]]選取列
輸出:
例 2. gdp_df[["Country", "GDP"]]_# 可以同時選取多列
輸出:
例 3. type(gdp_df["Country"])_#如果只是用[ ]則產(chǎn)生series
輸出:pandas.core.series.Series
例 4. gdp_df.Country_# 使用句點符號也能獲取某一列的Series
輸出:
例 5.gdp_df[2:5]
- 終索引是不被包括的!
- 行選取和2d數(shù)組類似
-
如果使用 [ ] 選取行,切片方法唯一的選項
輸出:
Paste_Image.png
loc方法
- 是一種基于 行標(biāo)簽和列標(biāo)簽 選取數(shù)據(jù)的方法
- 可以選取特定行或列,也可以同時指定所需要的行與列
- 和二維numpy array的格式非常類似
例 1.gdp_df.loc[["JP","DE"]]
- 在上面例子中,我們使用行索引選取行,能不能使用行標(biāo)簽實現(xiàn)選取呢?
-
loc方法正是基于標(biāo)簽選取數(shù)據(jù)的方法
輸出:
Paste_Image.png
例 2.gdp_df.loc[["JP","DE"],["Country", "GDP", "Continent"]]
- 以上例子選取了所有的列
-
我們可以加入需要的列標(biāo)簽
輸出:
Paste_Image.png
例 3.gdp_df.loc[:, ["Country", "GDP", "Continent"]]
-
選取所有的行,我們可以使用 : 來表示選取所有的行
輸出:
Paste_Image.png
iloc方法
- 和loc方法不同的地方是,iloc是基于行列索引進(jìn)行數(shù)據(jù)選擇而不是標(biāo)簽
- 具體使用方法和loc類似,用行/列索引代替標(biāo)簽
例 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]]
輸出:
例 3.gdp_df.iloc[:, [0,3,4]]
等價于gdp_df.loc[:, ["country", "GDP", "continent"]]
輸出:
使用布爾索引(boolean Indexing)篩選數(shù)據(jù)
- 我們可以使用pandas series來獲取一個boolean series
- 布爾索引的使用和二維numpy array類似
- 可以結(jié)合 [ ] 或者loc一起使用
例 1.gdp_df[gdp_df.Continent == "Asia"]
-
選出亞洲國家,下面兩行命令產(chǎn)生一樣的結(jié)果
輸出:
Paste_Image.png
例 2.gdp_df.loc[gdp_df.Continent == "Asia"]
例 3.gdp_df [ ( gdp_df.Continent == "Europe") & (gdp_df.GDP > 3 ) ]
輸出:
- 選出gdp大于3兆億美元的歐洲國家
04.案例:Iris 鳶尾花數(shù)據(jù)
讓我們來看一下經(jīng)典的iris數(shù)據(jù)
- 鳶尾花卉數(shù)據(jù)集, 來源 UCI 機器學(xué)習(xí)數(shù)據(jù)集
- 四個特征被用作樣本的定量分析,它們分別是花萼(sepal)和花瓣(petal)的長度(length)和寬度(width)
4.1數(shù)據(jù)的導(dǎo)入和觀察
col_names = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
- 用列表存儲列標(biāo)簽
iris = pd.read_csv('iris.txt', names=col_names)
- 讀取數(shù)據(jù),并指定每一列的標(biāo)簽
iris.head(10)
- 使用head/tail查看數(shù)據(jù)的頭和尾
-
查看開頭10行數(shù)據(jù)
輸出:
Paste_Image.png
iris.info()
- 使用info方法查看數(shù)據(jù)的總體信息
輸出:<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的行數(shù)與列數(shù)
- 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()
- 統(tǒng)計不同品種的數(shù)量
- 使用DataFrame的value_counts方法來實現(xiàn)
輸出:
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50
Name: species, dtype: int64
4.2數(shù)據(jù)選擇復(fù)習(xí)
例1:選取花瓣數(shù)據(jù),即 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的數(shù)據(jù)行
方法一:使用 [ ]
iris[5:11]
輸出:
方法二:使用 .iloc[]
iris.iloc[5:11, :]
輸出:
例3:選取品種為 Iris-versicolor 的數(shù)據(jù)
versicolor = iris[iris.species == 'Iris-versicolor']
versicolor.head()
輸出:4.3數(shù)據(jù)可視化初探
- 數(shù)據(jù)可視化一般是數(shù)據(jù)分析的第一步,讓我們對數(shù)據(jù)有一個直觀的了解。
- 通過可視化,我們往往可以觀察到一些規(guī)律,這些觀察到的規(guī)律可以對后續(xù)的建模起到指導(dǎo)作用。
- 可視化也是和非技術(shù)背景人溝通最有效的手段之一,不是所有人都懂得模型,但是大部分都可以理解圖形
設(shè)置在notebook中直接展示圖形輸出
注意DataFrame也是基于matplotlib作圖的
matplotlib inline
設(shè)置圖片清晰度
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>
使用布爾索引的方法分別獲取三個品種的數(shù)據(jù)
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>