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])

其中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
- 方式二:由字典建立
dic = {
\'math\':100,
\'English\':99
}
s = Series(data=dic)
s
注意:
使用字典建立Series,key作為顯示索引,value作為資料
1.2 Series的索引和切片
1.2.1 索引
可以使用中括号取單個索引(此時傳回的是元素類型),或者中括号裡一個清單取多個索引(此時傳回的是一個Series類型)。
(1) 顯式索引:
- 使用index中的元素作為索引值
- 使用s.loc[](推薦):注意,loc中括号中放置的一定是顯示索引
注意,此時是閉區間
(2) 隐式索引:
- 使用整數作為索引值
- 使用.iloc[](推薦):iloc中的中括号中必須放置隐式索引
注意,此時是半開區間
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() #去重函數
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\'])
s3 = s1+s2 #資料清洗
s3
其中未對齊的資料,用NaN填充,這些資料屬于無效資料.此時我們可以使用pd.isnull(),pd.notnull(),或s.isnull(),notnull()函數檢測缺失資料.
s3.isnull() #檢查資料是否為空值.
#要求去除錯誤資料
#第一步:擷取資料的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\'])
2.1.2 使用字典建立
dic = {
\'name\':[\'tom\',\'jay\',\'bobo\'],
\'salary\':[10000,5000,6000]
}
DataFrame(data=dic,index=[\'one\',\'two\',\'three\'])
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
(1)對行索引
df[\'張三\']
df.李四
#修改列索引
df.columns = [\'zhangsan\',\'lisi\']
#擷取前兩列
df[[\'lisi\',\'zhangsan\']]
(2)對行索引
df.loc[\'數學\']
df.iloc[1]
df.loc[[\'國文\',\'英語\']]
(3)對元素索引
df.loc[\'理綜\',\'zhangsan\'] #使用\',\'隔開,格式:[行,列]
2.3 DataFrame的切片
【注意】 直接用中括号時:
索引表示的是列索引
切片表示的是行切片
df[0:2] #切行
df.iloc[:,0:2] #切列
2.4 DataFrame的運算
(1) DataFrame之間的運算
同Series一樣:
- 在運算中自動對齊不同索引的資料
- 如果索引不對應,則補NaN
#假設張三期中考試數學被發現作弊,要記為0分,如何實作?
df.iloc[1,0] = 0
#李四因為舉報張三作弊立功,期中考試所有科目加100分,如何實作?
df[\'lisi\'] = df[\'lisi\'] + 100
df
df = df + 10 #所有元素+10
df
三 處理丢失資料
有兩種丢失資料:
- 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)
檢視np.nan(NaN)類型
type(np.nan)
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
#将某些數組元素指派為nan
df.iloc[1,2] = None
df.iloc[2,1] = np.nan
df.iloc[3,4] = None
df
2) pandas處理空值操作
isnull()
notnull()
dropna(): 過濾丢失資料
fillna(): 填充丢失資料
df.isnull()
#自己書寫bool一維數組
b = [True,False,False,False,True,True,True]
df.loc[b] #去除有NaN的行資料
使用方法擷取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
df.loc[condition]
3) 資料清洗函數
(1)df.dropna() 可以選擇過濾的是行還是列(預設為行):axis中0表示行,1表示的列
(2)df.drop(labels=3,axis=1) #去除第3行資料
df.dropna(axis=0) #在drop系列的函數中 axis=0 行 1列
(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