0 簡單介紹
pandas是一個Python語言的軟件包,在我們使用Python語言進行機器學習編程的時候,這是一個非常常用的基礎編程庫。本文是對它的一個入門教程。
pandas提供了快速,靈活和富有表現力的數據結構,目的是使“關系”或“標記”數據的工作既簡單又直觀。它旨在成為在Python中進行實際數據分析的高級構建塊。
另外,pandas常常和NumPy一起使用,本文中的源碼中也會用到NumPy(教程見Python 機器學習庫 NumPy 教程)。
1 安裝
pip install pandas
2 核心數據結構
pandas最核心的就是Series
和DataFrame
兩個數據結構。
這兩種類型的數據結構對比如下:
名稱 | 維度 | 說明 |
---|---|---|
Series | 1維 | 帶有標簽的同構類型數組 |
DataFrame | 2維 | 表格結構,帶有標簽,大小可變,且可以包含異構的數據列 |
DataFrame可以看做是Series的容器,即:一個DataFrame中可以包含若干個Series。
3 Index對象與數據訪問
pandas的Index對象包含了描述軸的元數據信息。當創建Series或者DataFrame的時候,標簽的數組或者序列會被轉換成Index。
請注意:
- Index並非集合,因此其中可以包含重復的數據
- Index對象的值是不可以改變,因此可以通過它安全的訪問數據
DataFrame提供了下面兩個操作符來訪問其中的數據:
loc
:通過行和列的索引來訪問數據iloc
:通過行和列的下標來訪問數據
3.1 基礎方法:[]
和.
series1 = pd.Series([1, 2, 3, 4, 5, 6, 7], index=["C", "D", "E", "F", "G", "A", "B"]) print("series1['E'] = {} \n".format(series1['E'])); print("series1.E = {} \n".format(series1.E));
結果:
注1:對於類似屬性的訪問方式.
來說,要求索引元素必須是有效的Python標識符的時候才可以,而對於series1.1
這樣的索引是不行的。
注2:[]
和.
提供了簡單和快速訪問pands數據結構的方法。這種方法非常的直觀。然而,由於要訪問的數據類型並不是事先知道的,因此使用這兩種方法方式存在一些優化限制。因此對於產品級的代碼來說,pandas官方建議使用pandas庫中提供的數據訪問方法。
3.2 loc與iloc
-
loc
:通過行和列的索引來訪問數據
-
iloc
:通過行和列的下標來訪問數據
通過這兩個操作符我們還可以訪問某個范圍之內的數據。
3.3 at與iat
這兩個操作符用來訪問單個的元素值(Scalar Value)。類似的:
at
:通過行和列的索引來訪問數據iat
:通過行和列的下標來訪問數據
3.4 Index對象
Index提供了查找,數據對齊和重新索引所需的基礎數據結構。
我們可以通過一個數組來創建Index對象。在創建的同時我們還可以通過name
指定索引的名稱:
index = pd.Index(['C','D','E','F','G','A','B'], name='note')
3.5 MultiIndex
MultiIndex,或者稱之為Hierarchical Index是指數據的行或者列通過多層次的標簽來進行索引。
4 Series數據對象
4.1 Series數據對象的生成
Series是一維結構的數據,Series的數據類型有list、ndarray、字典、常量;
以下結果中:
輸出的最后一行是Series中數據的類型,這里的數據都是int64
類型的。
數據在第二列輸出,第一列是數據的索引,在pandas中稱之為Index
。
-
list
data=[-2,-1,0,1,2] index=["a","b","c","d","e"] s1=pd.Series(data,index=index) print(s1)
結果:
-
ndarray
data=np.random.randn(5) index=["a","b","c","d","e"] s2=pd.Series(data,index=index) print(s2)
結果:
-
字典
data={'a':0,'b':1,'c':2} index=["a","b","c","d","e"] s3=pd.Series(data,index=index) print(s3)
結果:
-
常量
data=5 index=["a","b","c","d","e"] s4=pd.Series(data,index=index) print(s4)
結果:
如果不指定(像上面這樣),索引是[a, ...,z]的形式。不過我們也可以在創建Series的時候指定索引。索引未必一定需要是整數,可以是任何類型的數據,例如字符串。
4.2 Series數據對象的訪問
Series的訪問方法:s.values、s.index、索引訪問、切片訪問
print(s3.values) print(s3.index) print(s3[['a','b']]) #print(s3['a']) print(s3[:3])
結果:
5 DataFrame數據對象
5.1 DataFrame數據對象的生成
DataFrame的數據類型有列表組成的字典、嵌套列表、二維ndarray、Series組成的字典、字典的列表、字典組成的字典等;DataFrame默認的索引和列名都是[0, N-1]的形式。
-
列表組成的字典
data={'one':[1,2,3,4],'two':[5,6,7,8]} df1=pd.DataFrame(data) print(df1)
結果:
-
嵌套列表
data=[[1,2,3,4],[5,6,7,8]] df2=pd.DataFrame(data,index=['a','b'],columns=['one','two','three','four']) print(df2)
結果:
-
二維ndarray
data=np.zeros((2,),dtype=[('A','i4'),('B','f4'),('C','a10')]) print(data) df3=pd.DataFrame(data) print(df3)
結果:
-
Series組成的字典
DataFrame的不同列可以是不同的數據類型;如果以Series數組來創建DataFrame,每個Series將成為一行,而不是一列。
data={'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([4,5,6],index=['b','c','d'])} df4=pd.DataFrame(data) print(df4)
結果:
-
字典的列表
data=[{'a':1,'b':2},{'a':4,'b':4,'c':5}] df5=pd.DataFrame(data) print(df5)
結果:
-
字典組成的字典
data={('a','b'):{('A','B'):1,('A','C'):2}, ('a','a'):{('A','C'):3,('A','B'):4}, ('a','c'):{('A','B'):5,('A','B'):6}, ('b','a'):{('A','C'):7,('A','B'):8}, ('b','b'):{('A','D'):9,('A','B'):10} } df6=pd.DataFrame(data) print(df6)
結果:
5.2 DataFrame數據對象的訪問
print(df1) print(df1.index) print(df1.columns) print() print(df1.values) print() print(df1['one']) # print(df[['one']]) 此寫法帶列標 print() print(df1[0:1]) print(df1.loc[:,['one','two']]) print() print(df1.loc[[0],['one','two']]) print() print(df1.iloc[0:2,0:1]) print() print(df1.ix[0,['one','two']]) print() print(df1.ix[[0,1],[0,1]])
結果:
6 數據整合
6.1 Concatenate:串聯,連接,級連
6.2 Append:附加,增補
6.3 Merge:融合,歸並,合並
6.4 Join:合並,接合,交接
7 文件操作
pandas庫提供了一系列的read_
函數來讀取各種格式的文件,它們如下所示:
7.1 讀取Excel文件
注:要讀取Excel文件,還需要安裝另外一個庫:
xlrd
df1 = pd.read_excel("data/test.xlsx")
7.2 讀取CSV文件
df2 = pd.read_csv("data/test1.csv")
8 處理無效值
8.1 忽略無效值
通過pandas.DataFrame.dropna
函數拋棄無效值
8.2替換無效值
通過fillna
函數將無效值替換成為有效值
9 實例:使用pandas_datareader獲取股票數據並處理
# -*- coding: utf-8 -*- """ Created on Wed Jun 5 20:20:47 2019 @author: quanzhan """ import numpy as np import pandas as pd import pandas_datareader.data as web import datetime #獲取股票數據方法一: #df_csvsave=web.DataReader('601233.SS','yahoo',datetime.datetime(2019,6,1),datetime.date.today()) #保存到csv #df_csvsave.to_csv('D:\\AnacondaProjects\\learnnumpy\\exchange_06.csv',columns=df_csvsave.columns,index=True) #獲取股票數據方法二: df_csvload=pd.read_csv("D:\\AnacondaProjects\\learnnumpy\\exchange_06.csv",parse_dates=True,index_col=0,encoding='gb2312') print("***************************************************") print(df_csvload) print("***************************************************") print(df_csvload.index) print(df_csvload.columns) print("*****#股票內容查看: head()、tail()、shape、describe()、info()*********") #股票內容查看: head()、tail()、shape、describe()、info() print(df_csvload.head(3)) print(df_csvload.tail(3)) print(df_csvload.shape) print(df_csvload.describe()) print(df_csvload.info()) print("*******# 缺失值處理:isnull()、notnull()、dropna()、fillna()**********") # 數據規整化處理 # 缺失值處理:isnull()、notnull()、dropna()、fillna() print(df_csvload.isnull()) # .T.any()非缺失值仍然顯示 print(df_csvload.notnull().T.any()) # axis=0刪除包含缺失值的行 axis=1 刪除包含缺失值的列 how='all' 所有值均缺就刪除 how='any'只要有一個缺失值就刪除 print(df_csvload.dropna(axis=0,how='all')) # method='ffill'行或列上的上一個值來填充缺失值 inplace=True 改變原來的dataFrame print(df_csvload.fillna(method='ffill',axis=0,inplace=True)) print("***************# 精度轉換 :(1) '%0.2f'%x******************") # 特殊值處理 # 精度轉換 :(1) '%0.2f'%x df_csvload1=df_csvload.applymap(lambda x:'%0.3f'%x) df_csvload1.Volume=df_csvload.ix[:,['Volume']].apply(lambda x:'%0.0f'%x,axis=1) print(df_csvload1) print("******************# 精度轉換 :(2)*********************************") # 精度轉換 :(2) df_csvload2=df_csvload.round(1) df_csvload2.Volume=df_csvload2.Volume.astype(int) print(df_csvload2) print("****************# 特定值查詢后用此列的中位數填充*********************") # 特定值查詢后用此列的中位數填充 print(df_csvload) print() print(df_csvload[df_csvload.values==0]) df_csvload.loc[df_csvload.loc[:,'High']==0,'High']=df_csvload.High.median() print() print(df_csvload)
參考