Python 數據處理庫pandas教程(最後附上pandas_datareader使用實例)

0 簡單介紹

pandas是一個Python語言的軟件包,在咱們使用Python語言進行機器學習編程的時候,這是一個很是經常使用的基礎編程庫。本文是對它的一個入門教程。html

pandas提供了快速,靈活和富有表現力的數據結構,目的是使「關係」或「標記」數據的工做既簡單又直觀。它旨在成爲在Python中進行實際數據分析的高級構建塊。web

另外,pandas經常和NumPy一塊兒使用,本文中的源碼中也會用到NumPy(教程見Python 機器學習庫 NumPy 教程)。編程

1 安裝

pip install pandas

2 核心數據結構

pandas最核心的就是SeriesDataFrame兩個數據結構。數組

這兩種類型的數據結構對好比下:安全

名稱 維度 說明
Series 1維 帶有標籤的同構類型數組
DataFrame 2維 表格結構,帶有標籤,大小可變,且能夠包含異構的數據列

DataFrame能夠看作是Series的容器,即:一個DataFrame中能夠包含若干個Series。數據結構

3 Index對象與數據訪問

pandas的Index對象包含了描述軸的元數據信息。當建立Series或者DataFrame的時候,標籤的數組或者序列會被轉換成Index。app

請注意:

  1. Index並不是集合,所以其中能夠包含重複的數據
  2. Index對象的值是不能夠改變,所以能夠經過它安全的訪問數據

DataFrame提供了下面兩個操做符來訪問其中的數據:dom

  1. loc:經過行和列的索引來訪問數據
  2. 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)

 

參考

 Python數據處理庫pandas入門教程

Python數據處理庫pandas進階教程

相關文章
相關標籤/搜索