Pandas 三大物件
1.pandas的Series物件
pandas的Series物件是一個帶索引資料構成的一維陣列。可以用一個數組建立Series物件
import pandas as pd data=pd.Series([0.25,0.5,0.75,1.0]) print(data) # output:0 0.25 # 1 0.50 # 2 0.75 # 3 1.00 # dtype: float64
在上面的執行結果中,Series物件將一組資料和一組索引繫結在一起,我們可以通過values屬性和index屬性獲取資料。
data.values #output;[0.25 0.5 0.75 1. ] data.index #output:RangeIndex(start=0, stop=4, step=1)
另外,資料可以通過python的中括號索引標籤獲取:
data[1] #output:0.5 data[:3] #output:1 0.50 # 2 0.75 # dtype: float64
1.1 Series是通用的Numpy陣列
從上面的例子看出來,Numpy的一維陣列和Series物件基本可以等價交換,但是兩者的本質差異是存在於索引:Numpy陣列是通過隱式定義的整數索引獲取數值,而pandas的Series物件是用一種顯式定義的索引與數值關聯。
顯式索引的定義讓Series物件擁有了更強的定義。例如:索引不再僅僅是整數,還可以是任意想要的型別。
data=pd.Series([0.25,0.5,0.75,1.0],index=['a','b','c','d']) print(data) print(data['a']) #output:a 0.25 # b 0.50 # c 0.75 # d 1.00 # dtype: float64 # 0.25
注意:也可以使用不連續或不按順序的索引。
data=pd.Series([0.25,0.5,0.75,1.0],index=[2,5,3,7])
1.2 Series是特殊的字典
Series物件看成是一種特殊的Python字典。字典是一種將任意鍵對映到一組任意值的資料結構,而Series物件其實是一組型別鍵對映到一組型別值的資料結構。
import pandas as pd population_dict={'California':38332521,'Texas':26448193,'New York':19651127,'Florida':19552860,'Illinois':12882135} population=pd.Series(population_dict) print(population) #output:California 38332521 # Texas 26448193 # New York 19651127 # Florida 19552860 # Illinois 12882135 # dtype: int64
上面對陣列的操作仍然可以對這個Series物件適用。如切片操作,取值等。
1.3 建立Series物件
一般的建立方式:pd.Series(data,,index=index)
a)data可以是列表或者Numpy,這時index預設值為整數序列
z=pd.Series([2,4,6]) print(z) #output:0 2 # 1 4 # 2 6 # dtype: int64
b)data也可以是一個標量,建立Series物件時會重複填充到每個索引上:
z=pd.Series(5,index=[100,200,300]) print(z) #output:100 5 # 200 5 # 300 5 # dtype: int64
c)data還可以是一個字典,index預設是排序的字典鍵:
z=pd.Series({2:'a',1:'b',3:'c'},index=[3,2]) print(z) #output:3 c # 2 a # dtype: object #出現這樣的原因是:Series物件只會保留顯式定義的鍵值對。
2.pandas的DataFrame物件
2.1 DataFrame是通用的Numpy陣列
可以將DataFrame看作是一種既有靈活的行索引,又有靈活的列名的二維陣列。它的行和列都可以通過索引獲取
同時,可以將DataFrame看成是有序‘排列’的若干Series物件
#建立基本的DataFrame,採用Series物件來解決。 import pandas as pd population_dict={'California':38332521,'Texas':26448193,'New York':19651127,'Florida':19552860,'Illinois':12882135} population=pd.Series(population_dict) area_dict={'California':423967,'Texas':170312,'New York':141297,'Florida':170312,'Illinois':149995} area=pd.Series(area_dict) #用一個字典建立一個包含這些資訊的二維陣列: states=pd.DataFrame({'population':population,'area':area}) print(states) #output: population area # California 38332521 423967 # Texas 26448193 170312 # New York 19651127 141297 # Florida 19552860 170312 # Illinois 12882135 149995 #檢視行索引標籤(index 屬性) states.index #output:Index(['California', 'Texas', 'New York', 'Florida', 'Illinois'], dtype='object') #返回的是Index物件 #檢視列索引標籤 states.columns #output:Index(['population', 'area'], dtype='object')
2.2 DataFrame是特殊的字典
我們可以把DataFrame看成是特殊的字典。字典是一個鍵對映一個值,而DataFrame是一列對映一個Series的資料。
# 通過‘area’列屬性獲取包含於area列的所有資料 print(states['area']) #output:California 423967 # Texas 170312 # New York 141297 # Florida 170312 # Illinois 149995 # Name: area, dtype: int64
2.3 建立DataFrame物件
a)通過單個Series物件建立
#DataFrame 是一組Series物件的集合,可以使用單個Series建立一個單列的DataFrame pd.DataFrame(population,columns=['populations']) #output populations # California 38332521 # Texas 26448193 # New York 19651127 # Florida 19552860 # Illinois 12882135
b)通過字典列表建立
任何元素是字典的列表都可以變成DataFrame.用一個簡單的列表綜合來建立一些資料:
data=[{'a':i,'b':2*i}for i in range(3)] z=pd.DataFrame(data,index=list('ABC')) print(z) #output: a b # A 0 0 # B 1 2 # C 2 4
當字典中有些鍵不存在時,Pandas也會使用缺失值(NaN)(not a number)來表示:
data=[{'a':1,'b':2},{'b':3,'c':4}] z=pd.DataFrame(data) print(z) #output: a b c # 0 1.0 2 NaN # 1 NaN 3 4.0
c)通過Series物件字典建立
見最開始的示例中DataFrame的建立方式。
d)通過Numpy二維陣列建立
假如有一個二維陣列,就可以建立一個可以指定行列索引值的DataFrame.如果不指定行列索引值,那麼行列預設都是整數索引值:
data=np.random.rand(3,2) z=pd.DataFrame(data,columns=['foo','bar'],index=['a','b','c']) print(z) #output: foo bar # a 0.679849 0.791610 # b 0.438278 0.331297 # c 0.998745 0.861642
e)通過Numpy結構化陣列建立
首先是介紹來自於官網的結構化陣列:
Structured type, two fields: the first field contains an unsigned int, the second an int32: >> np.dtype([('f1', np.uint), ('f2', np.int32)]) #output:dtype([('f1', '<u4'), ('f2', '<i4')])
通過結構化陣列建立DataFrame:
A=np.zeros(3,dtype=[('A','i8'),('b','f8')]) print(A) #output:[(0, 0.) (0, 0.) (0, 0.)] z=pd.DataFrame(A) print(z) #output: A B # 0 0 0.0 # 1 0 0.0 # 2 0 0.0
3.pandas的Index物件
先簡單的建立Index物件陣列
import pandas as pd index=pd.Index([2,3,5,7,11]) print(index) #output:Int64Index([2, 3, 5, 7, 11], dtype='int64')
3.1 將Index看做不可變陣列
Index物件的許多操作都類似於陣列,可以採用Python標準的取值方法獲取數值,也可以通過切片獲取數值:
index[1] #output:3 #通過切片獲取數值 # 每隔一個值取一個,一下子看蒙了 print(index[::2])
但是,Index物件 裡面的值是不可更改的,如果這樣:index[0]=1
會報錯,這就是不可修改的含義。
3.2 將Index看做有序集合
Index物件遵循Python標準庫的集合(set)資料結構的許多習慣用法,包括並集、交集、差集等。
indA=pd.Index([1,3,5,7,9]) indB=pd.Index([2,3,5,7,11]) # 交集 print(indA&indB) # 並集 print(indA|indB) # 異或 print(indA^indB) #output:Int64Index([3, 5, 7], dtype='int64') # Int64Index([1, 2, 3, 5, 7, 9, 11], dtype='int64') # Int64Index([1, 2, 9, 11], dtype='int64')