天天看點

第二節 pandas 基礎知識

   pandas 兩種資料結構 Series和DataFrame

一  Series 一種類似與一維數組的對象

  • values:一組資料(ndarray類型)
  • index:相關的資料索引标簽

1.1  series的建立  

Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)

data:清單/numpy一維資料/dic.
index:顯示索引,格式為:[]
dtype:資料的類型
name:Series的唯一辨別
copy:是否産生副本      
兩種建立方式:
    (1)由清單或numpy數組建立
    (2)由字典建立:不能在使用index.但是依然存在預設索引      
  • 方式一:由清單或numpy數組建立
#使用清單建立Series
Series(data=[1,2,3,4,5])      
第二節 pandas 基礎知識

  其中0,1,2,3,4是預設索引.

#使用numpy建立數組
arr=np.random.randint(50,100,size=(10,))
s2=Series(data=arr,index=[\'a\',\'b\',\'c\',\'d\',\'e\',\'f\',\'g\',\'h\',\'i\',\'j\'],name=\'s2\') #index指定顯示索引
s2      
第二節 pandas 基礎知識
  • 方式二:由字典建立
dic = {
    \'math\':100,
    \'English\':99
}
s = Series(data=dic)
s      
第二節 pandas 基礎知識
注意:
    使用字典建立Series,key作為顯示索引,value作為資料      

1.2 Series的索引和切片

1.2.1 索引

可以使用中括号取單個索引(此時傳回的是元素類型),或者中括号裡一個清單取多個索引(此時傳回的是一個Series類型)。

(1) 顯式索引:

- 使用index中的元素作為索引值

- 使用s.loc[](推薦):注意,loc中括号中放置的一定是顯示索引

注意,此時是閉區間

(2) 隐式索引:

- 使用整數作為索引值
- 使用.iloc[](推薦):iloc中的中括号中必須放置隐式索引           

注意,此時是半開區間

第二節 pandas 基礎知識
s.math #屬性索引,不推薦使用

s[0] #直接索引

s[\'math\'] #直接的顯式索引

s.loc[\'math\']  #顯式索引

s.iloc[0:2]  #隐式索引      

1.2.1 切片:隐式索引切片和顯示索引切片

顯示索引切片:index和loc
隐式索引切片:整數索引值和iloc      

1.3 Series的基本概念

  可以把Series看成一個定長的有序字典,向Series增加一行:相當于給字典增加一組鍵值對。

s.shape ---> (2,)

s.values ---> array([100,  99], dtype=int64)

s.index  ----> Index([\'math\', \'English\'], dtype=\'object\')

s.head(1) ----> 取第一條資料

s.tail(1) ----> 取最後一條資料      

   ***去重

s = Series([1,1,2,2,3,3,4,5,6,6,6,7,8,8,0])

s.unique()  #去重函數      
第二節 pandas 基礎知識

1.3 Series的運算

(1) + - * /

(2) add() sub() mul() div() : s1.add(s2,fill_value=0)      
s1.add(s2)  #s1+s2      
注意:
    Series之間的運算在運算中自動對齊不同索引的資料,如果索引不對應,則補NaN.      

 1.4 索引不能完全對齊的加法運算詳解

s1 = Series([1,2,3,4,5],index=[\'a\',\'b\',\'c\',\'d\',\'e\'])

s2 = Series([1,2,3,4,5],index=[\'a\',\'b\',\'c\',\'f\',\'e\'])

第二節 pandas 基礎知識
s3 = s1+s2   #資料清洗
s3      
第二節 pandas 基礎知識

  其中未對齊的資料,用NaN填充,這些資料屬于無效資料.此時我們可以使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函數檢測缺失資料.

s3.isnull() #檢查資料是否為空值.      
第二節 pandas 基礎知識
#要求去除錯誤資料

#第一步:擷取資料的bool值一維數組

s3.notnull() #如果資料為空,傳回false,不為空為True

#第二步:使用擷取的bool數組過濾資料,留下true的資料

s3[s3.notnull()]
      

 二 DataFrame

DataFrame是一個【表格型】的資料結構。DataFrame由按一定順序排列的多列資料組成。設計初衷是将Series的使用場景從一維拓展到多元。DataFrame既有行索引,也有列索引。

  • 行索引:index
  • 列索引:columns
  • 值:values

2.1 DataFrame的建立

  最常用的方法是傳遞一個字典來建立。DataFrame以字典的鍵作為每一【列】的名稱,以字典的值(一個數組)作為每一列。

此外,DataFrame會自動加上每一行的索引。

使用字典建立的DataFrame後,則columns參數将不可被使用。

同Series一樣,若傳入的列與字典的鍵不比對,則相應的值為NaN。

 2.1.1 使用ndarray建立DataFrame

DataFrame(data=np.random.randint(0,100,size=(3,3)),index=[\'a\',\'b\',\'c\'],columns=[\'A\',\'B\',\'C\'])      
第二節 pandas 基礎知識

 2.1.2 使用字典建立

dic = {
    \'name\':[\'tom\',\'jay\',\'bobo\'],
    \'salary\':[10000,5000,6000]
}
DataFrame(data=dic,index=[\'one\',\'two\',\'three\'])      
第二節 pandas 基礎知識

2.1.3 屬性

  DataFrame屬性:values、columns、index、shape

2.2 DataFrame的索引

(1) 對列進行索引

- 通過類似字典的方式  df[\'q\']
- 通過屬性的方式     df.q
可以将DataFrame的列擷取為一個Series。傳回的Series擁有原DataFrame相同的索引,且name屬性也已經設定好了,
就是相應的列名。

      

  (2) 對行進行索引

  - 使用.loc[]加index來進行行索引

  - 使用.iloc[]加整數來進行行索引

  同樣傳回一個Series,index為原來的columns。

  

  (3) 對元素索引的方法

  - 使用列索引
  - 使用行索引(iloc[3,1] or loc[\'C\',\'q\']) 行索引在前,列索引在後           
#建立資料
dic = {
    \'張三\':[150,150,150,300],
    \'李四\':[0,0,0,0]
}
df = DataFrame(data=dic,index=[\'國文\',\'數學\',\'英語\',\'理綜\'])
df      
第二節 pandas 基礎知識

(1)對行索引

df[\'張三\']

df.李四

#修改列索引
df.columns = [\'zhangsan\',\'lisi\']

#擷取前兩列
df[[\'lisi\',\'zhangsan\']]      

(2)對行索引

df.loc[\'數學\']

df.iloc[1]

df.loc[[\'國文\',\'英語\']]      

(3)對元素索引

第二節 pandas 基礎知識
df.loc[\'理綜\',\'zhangsan\']  #使用\',\'隔開,格式:[行,列]      

2.3 DataFrame的切片

【注意】 直接用中括号時:

  索引表示的是列索引
  切片表示的是行切片      
第二節 pandas 基礎知識
df[0:2]   #切行

df.iloc[:,0:2]   #切列      
第二節 pandas 基礎知識

2.4 DataFrame的運算

(1) DataFrame之間的運算

    同Series一樣:

- 在運算中自動對齊不同索引的資料
- 如果索引不對應,則補NaN      
#假設張三期中考試數學被發現作弊,要記為0分,如何實作?
df.iloc[1,0] = 0      
第二節 pandas 基礎知識
#李四因為舉報張三作弊立功,期中考試所有科目加100分,如何實作?
df[\'lisi\'] = df[\'lisi\'] + 100
df      
第二節 pandas 基礎知識
df = df + 10  #所有元素+10
df      
第二節 pandas 基礎知識

三 處理丢失資料 

有兩種丢失資料:

  • None
  • np.nan(NaN)
#導包
import pandas as pd
from pandas import Series
from pandas import DataFrame
import numpy as np      

3.1 None,np.nan

  None是Python自帶的,其類型為python object。是以,None不能參與到任何計算中。

  np.nan是浮點類型,能參與到計算中。但計算的結果總是NaN。

#檢視None的資料類型
type(None)      
第二節 pandas 基礎知識
檢視np.nan(NaN)類型
type(np.nan)      
第二節 pandas 基礎知識

3.2 pandas中的None與NaN

1) pandas中None與np.nan都視作np.nan

np.random.seed(2)
df = DataFrame(data=np.random.randint(0,100,size=(7,6)))
df      
第二節 pandas 基礎知識
#将某些數組元素指派為nan
df.iloc[1,2] = None
df.iloc[2,1] = np.nan
df.iloc[3,4] = None
df      
第二節 pandas 基礎知識

2) pandas處理空值操作

isnull()
notnull()
dropna(): 過濾丢失資料
fillna(): 填充丢失資料      
df.isnull()      
第二節 pandas 基礎知識
#自己書寫bool一維數組
b = [True,False,False,False,True,True,True]      
df.loc[b] #去除有NaN的行資料      
第二節 pandas 基礎知識

使用方法擷取bool數組

df.isnull().any(axis=0) #每一行隻要有True ,則為True

df.isnull().all(axis=0) #每一行全部為True ,則為True

固定搭配:# notnull() ===> all()   isnull() ==> any()      
condition = df.notnull().all(axis=1)
condition      
第二節 pandas 基礎知識
df.loc[condition]      
第二節 pandas 基礎知識

3) 資料清洗函數

(1)df.dropna() 可以選擇過濾的是行還是列(預設為行):axis中0表示行,1表示的列      
(2)df.drop(labels=3,axis=1)   #去除第3行資料

df.dropna(axis=0)   #在drop系列的函數中  axis=0 行  1列      
第二節 pandas 基礎知識
(3)df.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

value:填充的資料,可以是某一個值,也可以是字典;
method:填充的方法,{\'backfill\', \'bfill\', \'pad\', \'ffill\', None};
axis : {0 or \'index\', 1 or \'columns\'};
limit:填充的次數,int, default None