為什麼要學習pandas?
- numpy已經可以幫助我們進行資料的處理了,那麼學習pandas的目的是什麼呢?
- numpy能夠幫助我們處理的是數值型的資料,當然在資料分析中除了數值型的資料還有好多其他型別的資料(字串,時間序列),那麼pandas就可以幫我們很好的處理除了數值型的其他資料!
什麼是pandas?
- 首先先來認識pandas中的兩個常用的類
- Series
- DataFrame
Series
-
Series是一種類似與一維陣列的物件,由下面兩個部分組成:
- values:一組資料(ndarray型別)
- index:相關的資料索引標籤
-
Series的建立
- 由列表或numpy陣列建立
- 由字典建立
from pandas import Series s = Series(data=[1,2,3,'four]) # 建立一個有索引的資料 s 程式碼結果: 0 1 1 2 2 3 3 four dtype: object
import numpy as np s = Series(data = np.random.randint(0,100,size=(3,))) # 使用numpy模組和pandas模組中的Series類,建立一個3行0列的簡單表格 s 程式碼結果: 0 3 1 43 2 82 dtype: int64
from pandas import Series s = Series(data=[1,2,3,'four'],index=['a','b','c','d']) # 建立一個表格,行索引是a,b,c,d 對應的值是data中的元素 s 程式碼結果: a 1 b 2 c 3 d four dtype: object
-
為什麼需要有顯示索引
-
顯示索引可以增強Series的可讀性
form pandas import Series dic ={ '語文':100, '數學':120, '英語':125, } s = Series(data=dic) s 程式碼結果: 語文 100 數學 99 理綜 250 dtype: int64
-
-
Series的索引和切片
from pandas import Series dic = { '語文':100, '數學':120, '英語':125 } s = Series(data=dic) s 程式碼結果: 語文 100 數學 120 理綜 125 dtype: int64 s[0] # 取出索引為0,第一行語文的資料 s.語文 # 直接取出語文這一行的資料 s.[0:2] # 取出索引0-2的資料,就是語文、數學這兩行
-
Series的常用屬性
- s.shape 顯示元素的行數
- s.size 顯示元素的個數,索引
- s.index 元素的列索引
- s.values 返回值
- s.dtype 元素的型別
-
Series的常用方法
-
head(),tail()
-
unique()
-
isnull(),notnull()
-
add() sub() mul() div()
import numpy as np from pandas import Series s = Series(data = np.random.randint(1,100),size=(4,)) 程式碼結果: 0 12 1 51 2 50 3 96 dtype: int32 s.head(2) # 顯示前2行的資料 程式碼結果: 0 12 1 51 dtype: int32 s.tail(2) # 顯示後3個資料 程式碼結果: 0 12 1 51 dtype: int32 s.unique() # 去重 程式碼結果: array([12, 51, 50, 96]) s.isnull() # 用於判斷每一個元素是否為空,為空返回True,否則返回False 程式碼結果: 0 False 1 False 2 False 3 False dtype: bool s.notnull() 程式碼結果: 0 False 1 False 2 False 3 False dtype: bool
-
DataFrame
-
DataFrame是一個【表格型】的資料結構。DataFrame由按一定順序排列的多列資料組成。設計初衷是將Series的使用場景從一維擴充到多維。DataFrame既有行索引,也有列索引。
- 行索引:index
- 列索引:columns
- 值:values
-
DataFrame的建立
- ndarray建立
- 字典建立
from pandas import DataFrame df = DataFrame(data=([1,2,3],[1,2,3])) 建立一個二維的表格 df 程式碼結果: | 0 | 1 | 2 | | ---- | ---- | ---- | | 0 | 1 | 2 | | 1 | 1 | 2 | from pandas import DataFrame import numpy as np df = DataFrame(data=np.random.randint(1,100,size=(3,4))) df 程式碼結果: | 0 | 1 | 2 | 3 | | ---- | ---- | ---- | ---- | | 0 | 9 | 68 | 39 | | 1 | 86 | 83 | 53 | | 2 | 68 | 82 | 80 |
import numpy as np from pandas import DataFrame dic = { 'name':['zt','cy','xcy'], 'salary':[1000,2000,3000] } df = DataFrame(data=dic,index=['a','b','c']) df 程式碼結果: | -----| name | salary | | ---- | ------ | ----- | | a | zt | 1000 | | b | cy | 2000 | | c | xcy | 3000 |
-
DataFrame的屬性
-
values、columns、index、shape
-
df.values:
array([['zt', 1000], ['cy', 2000], ['xcy', 3000]], dtype=object)
-
df.columns:
Index(['name', 'salary'], dtype='object')
-
df.index:
Index(['a', 'b', 'c'], dtype='object')
</details>
-
df.shape:
(3, 2)
-
-
練習:
根據以下考試成績表,建立一個DataFrame,命名為df:張三 李四 語文 150 0 數學 150 0 英語 150 0 理綜 300 0
import numpy as np from pandas import DataFrame dic = { '張三':[150,150,150,150], '李四':[0,0,0,0], } df = DataFrame(data=dic,index=['語文','數學','英語','理綜']) df
-
-
DataFrame索引操作
- 對行進行索引
import numpy as np from pandas import DataFrame df = DataFrame(data = np.random.randint(1,100,size=(4,5)),index=['a','b','c','d']) df 程式碼結果: | 0 | 1 | 2 | 3 | 4 | | ---- | ---- | ---- | ---- | ---- | | a | 72 | 4 | 35 | 97 | | b | 53 | 36 | 4 | 75 | | c | 65 | 35 | 25 | 55 | | d | 8 | 68 | 52 | 33 |
- 對列進行索引
import numpy as np from pandas import DataFrame df = DataFrame(data = np.random.randint(1,100,size=(9,5)),columns=['a','b','c','d','e']) df 程式碼結果: | a | b | c | d | e | | ---- | ---- | ---- | ---- | ---- | | 0 | 87 | 35 | 75 | 10 | | 1 | 12 | 83 | 11 | 14 | | 2 | 57 | 8 | 62 | 99 | | 3 | 29 | 55 | 96 | 37 | | 4 | 66 | 65 | 1 | 94 | | 5 | 32 | 54 | 17 | 75 | | 6 | 48 | 26 | 65 | 46 | | 7 | 3 | 6 | 10 | 14 | | 8 | 14 | 26 | 32 | 96 |
- 對元素進行索引
df['a'] # 取單列,如果df有顯示的索引,透過索引機制去行或者列的時候只可以使用顯示索引 df[['a','c']] # 取多列
iloc: # 透過隱式索引取行 loc: # 透過顯示索引取行 df.loc[0] # 取單行 df.iloc[[0,3,5]] # 取多行
#取單個元素 df.iloc[0,2] df.loc[0,'a'] #取多個元素 df.iloc[[1,3,5],2]
- 對行進行索引
-
DataFrame的切片操作
-
對行進行切片
| a | b | c | d | | ---- | ---- | ---- | ---- | | 0 | 95 | 87 | 83 | | 1 | 76 | 82 | 78 | | 2 | 69 | 94 | 89 | | 3 | 74 | 77 | 93 | | 4 | 75 | 88 | 93 | | 5 | 67 | 98 | 66 | | 6 | 95 | 83 | 71 | | 7 | 72 | 74 | 79 | df[0:2] # 切行 程式碼結果: | a | b | c | d | | ---- | ---- | ---- | ---- | | 0 | 95 | 87 | 83 | | 1 | 76 | 82 | 78 | df.iloc[:,0:2] # 切列 程式碼結果: | a | b | | ---- | ---- | | 0 | 95 | | 1 | 76 | | 2 | 69 | | 3 | 74 | | 4 | 75 | | 5 | 67 | | 6 | 95 | | 7 | 72 |
-
對列進行切片
df.iloc[:,0:2] # 切列 程式碼結果: | a | b | | ---- | ---- | | 0 | 95 | | 1 | 76 | | 2 | 69 | | 3 | 74 | | 4 | 75 | | 5 | 67 | | 6 | 95 | | 7 | 72 |
-
-
總結:df索引和切片操作
- 索引:
- df[col]:取列
- df.loc[index]:取行
- df.iloc[index,col]:取元素
- 切片:
- df[index1:index3]:切行
- df.iloc[:,col1:col3]:切列
- 索引:
-
練習題:
1. 假設ddd是期中考試成績,ddd2是期末考試成績,請自由建立ddd2,並將其與ddd相加,求期中期末平均值。 import numpy as np from pandas import DataFrame dic1 ={ '張三':[150,150,150,150], '李四':[0,0,0,0] } dic2={ '張三':[120,120,120,120], '李四':[15,15,15,15] } ddd = DataFrame(data=dic1,index=['語文','數學','英語','理綜']) ddd2 = DataFrame(data=dic2,index=['語文','數學','英語','理綜']) (ddd + ddd2) / 2 # 其中期末的平均值 程式碼結果: | 張三 | 李四 | | ---- | ----- | | 語文 | 135.0 | | 數學 | 135.0 | | 英語 | 135.0 | | 理綜 | 135.0 | 2. 假設張三期中考試數學被發現作弊,要記為0分,如何實現? dd.loc['數學','張三'] = 0 ddd 程式碼結果: | 張三 | 李四 | | ---- | ---- | | 語文 | 150 | | 數學 | 0 | | 英語 | 150 | | 理綜 | 150 | 3. 李四因為舉報張三作弊立功,期中考試所有科目加100分,如何實現? ddd['李四'] += 100 ddd 程式碼結果: | 張三 | 李四 | | ---- | ---- | | 語文 | 150 | | 數學 | 0 | | 英語 | 150 | | 理綜 | 150 | 4. 後來老師發現有一道題出錯了,為了安撫學生情緒,給每位學生每個科目都加10分,如何實現? ddd += 10 ddd 程式碼結果: | 張三 | 李四 | | ---- | ---- | | 語文 | 160 | | 數學 | 10 | | 英語 | 160 | | 理綜 | 160 |
-
擴充:時間資料型別的轉換
- pd.to_datetime(col)
-
將某一列設定為行索引
- df.set_index()
dic = { 'time':['2010-10-10','2011-11-20','2020-01-10'], 'temp':[33,31,30] } df = DataFrame(data=dic) df | | time | temp | | ---- | ---------- | | | 0 | 2010-10-10 | 33 | | 1 | 2011-11-20 | 31 | | 2 | 2020-01-10 | 30 | #檢視time列的型別 df['time'].dtype dtype('O') import pandas as pd #將time列的資料型別轉換成時間序列型別 df['time'] = pd.to_datetime(df['time']) df['time'] #將time列作為源資料的行索引 df.set_index('time',inplace=True)