Python資料分析入門學習筆記
- Pandas和Numpy
-
- Numpy在多元數組的應用
-
- 運算
-
- 數組本身的運算
- 兩數組之間的運算
- 索引
- 切片
- 其他功能
- Pandas
-
- 檔案讀取
- 索引和切片
-
- loc函數
- iloc函數
- 資料合并
-
- merge
- concat
Pandas和Numpy
pandas和numpy都是資料分析中經常用到的庫兩者功能上有許多不同.
pandas和numpy都是科學計算包
Numpy擅長處理多元數組和矩陣,它常見用于資料分析方向.
Pandas是一個以資料分析而建立的子產品,以Numpy為基礎,内含許多類和标準化的資料模型和函數.能幫我們高效快速地處理資料集,是以是大資料和機器學習的根基
Numpy在多元數組的應用
運算
數組本身的運算
例1.
data = [1,2,3,4,5,6]
x = np.array(data)#使用清單生成數組
print(x)#列印數組
print(x.dtype)#數組的資料元素的類型
print(x.ndim)#次元的個數
print(x.shape)#各個次元的大小
print(x*2)#數組乘
print(x>2)#數組判斷
[1,2,3,4,5,6]
int64
1
(6,)
[2,4,6,8,10,12]
[true,false,false,false,false,false]
兩數組之間的運算
numpy兩個數組間的運算能直接進行,數組的運算參考線性代數.
例2.
# np.add 這是一個相加函數
data1 = np.array([[1.1,2],[3,4.1],[5.2,6]])
data2 = np.array([[3.1,5],[6,4],[9.8,3]])
print(data1+data2)
print(np.add(data1, data2))
[[ 4.2 7. ]
[ 9. 8.1]
[ 15. 9. ]]
[[ 4.2 7. ]
[ 9. 8.1]
[ 15. 9. ]]
索引
索引的意思也就是查找,就是準确地查找到數組的某個位置的資料.
例3.
#對數組進行乘法和布爾判斷運算
x = np.array([1,2,3])
print(x*2)
print(x>2)
[1 2]
2
2
切片
numpy和pandas都是可以切片的,numpy的切片是連續的,pandas可以進行不連續切片.
numpy切片的過程是從第一個想要的對象到最後一個不想要的對象之前的連續的對象就是最後得到的對象.
相當于是一個左閉右開區間.
接下來是一個具體的例子可以用來了解.
例4.
x = np.array(np.arange(1,9,1))
print(x)
print(x[1:3]) # 右邊開區間
print(x[:3]) # 左邊預設為 0
print(x[1:])# 右邊預設為元素個數
print(x[0:7:2]) #下标遞增2
[1 2 3 4 5 6 7 8]
[2 3]
[1 2 3]
[2 3 4 5 6 7 8]
[1 3 5 7]
其他功能
numpy也有重塑和轉置數組的功能
x = np.arange(12).reshape(2,3,2).其中(次元數,每個次元的對象個數,遞增的跨度),每個參數的意義,其中每個參數相乘最後要等于對象的總個數.
轉置函數就是T或者swapaxes.轉置後的效果相當于數組的轉置,參考線性代數.
Pandas
檔案讀取
首先導入 pandas 并命名。import padans as pd
檔案讀取的函數是 pd.read_csv,這代表讀取一個文本格式的資料。
讀取檔案
在Pandas中讀取檔案,如果檔案和代碼檔案不在同一個檔案夾下面,需要輸入檔案的具體路徑.
例1.
import pandas as pd
NACIS2016= pd.read_csv('NACIS2016.csv')
讀取檔案的部分
例2.
#head函數将幫你調取出前五行資料以便觀察這個資料的行列資訊
NACIS2016.head()
索引和切片
pandas和numpy有的索引和切片非常的相似,但是比numpy多一些拓展的功能比如說可以進行不連續切片.
pandas的切片和索引有兩個函數loc和iloc.
loc函數
loc 函數根據行标的内容進行索引.通過行标簽索引行資料.
NACIS2016.loc[0]#loc[0]表示索引的是第1行(index 是整數)
data = [[1,2,3],[4,5,6]]
index = ['d','e']
columns=['a','b','c']
df = pd.DataFrame(data=data, index=index, columns=columns)#loc也可以接受str标簽
loc函數同樣可以切片,方法跟numpy一樣.
iloc函數
iloc 以行所處的位置,也就是行号為基礎進行索引,其中的 i 代表 integer,說明這個函數隻接受數字。是以,我們要擷取哪一行的信 息,就填入那一行對應的數字.iloc不支援str字元,會報錯.
loc和iloc對比
例3.
print(NACIS2016.loc[:3, ['Kind of Business','Jan. 2016']])
print(NACIS2016.iloc[:3 , [1,2]] )
Kind of Business Jan. 2016
0 Motor vehicle and parts dealers 92341
1 Automobile and other motor vehicle dealers 84678
2 Automotive parts, acc., and tire stores 7663
3 Furniture, home furn, electronics, and applian... 17426
Kind of Business Jan. 2016
0 Motor vehicle and parts dealers 92341
1 Automobile and other motor vehicle dealers 84678
2 Automotive parts, acc., and tire stores 7663
總結:loc是根據行标簽索引,是以并不遵守左閉右開的規則,而iloc是根據行位來搜尋,是以符合python的左閉右開區間.
資料合并
用pandas講資料合并的時候有三種方法:merge,concat,join.
由于merge和join方法幾乎一樣,是以這裡隻講一下merge和join.
合并方式:
1.inner join(取交集)
2.outer jion(取并集)
3.left jion(向左合并)
4.right jion(向右合并)
merge
merge有兩種用法,一種是用左表調用 merge:DataFrame.merge(right, how=‘inner’, on=None, left_on=None, right_on=None),另一種是用pandas 調用 merge:pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None)
DataFrame:DataFrame是Python中Pandas庫中的一種資料結構,它類似excel,是一種二維表。
或許說它可能有點像matlab的矩陣,但是matlab的矩陣隻能放數值型值(當然matlab也可以用cell存放多類型資料),DataFrame的單元格可以存放數值、字元串等,這和excel表很像。
同時DataFrame可以設定列名columns與行名index,可以通過像matlab一樣通過位置擷取資料也可以通過列名和行名定位
print(NACIS2016_subset.merge(NACIS2017_subset, how='inner', on = ['NAICS Code']))#第一種方法
print(pd.merge(NACIS2016_subset, NACIS2017_subset, how='inner', on = ['NAICS Code']))#第二種方法
concat
Merge 的拼接是橫向的,concat 則預設縱向拼接,同時可以設成橫向 拼接。但 concat 的橫向拼接不如 merge 那麼好,是以我們用 concat 主要是縱向拼接。
其文法格式為:pd.concat(objs, axis=0, join=‘outer’)。第一位 是要拼接的資料表格組成的清單,第二位是以什麼為軸來拼接,0 是 以行為軸,1 是以列為軸,預設值 0,第三位是合并方式。
pd.concat(objs, axis=0, join=‘outer’)
objs: series,dataframe或者是panel構成的序列lsit
axis: 需要合并連結的軸,0是行,1是列
join:連接配接的方式 inner,或者outer
#縱向拼接,列名需要一樣
df1 = pd.DataFrame({'a':[1, 2, 3],
'b':[1, 2, 3],
'c':[1, 2, 3]})
df2 = pd.DataFrame({'a':[1, 2, 3],
'b':[1, 2, 3],
'c':[1, 2, 3]})
df3= pd.DataFrame({'a':[1, 2, 3],
'b':[1, 2, 3],
'c':[1, 2, 3]})
frames = [df1, df2, df3] # 現将表構成list,然後在作為concat的輸入
pd.concat(frames)
a b c
0 1 1 1
1 2 2 2
2 3 3 3
0 1 1 1
1 2 2 2
2 3 3 3
0 1 1 1
1 2 2 2
2 3 3 3
橫向拼接NACIS2016_subset, NACIS2017_subset,保留NACIS2016_subset,NACIS2016_subset全部行
frames = [NACIS2016_subset, NACIS2017_subset]
pd.concat(frames, axis=1, join='outer')
橫向拼接,concat不如merge友善,且功能局限