1. 程式人生 > >pandas教程:series和dataframe

pandas教程:series和dataframe

起步

pandas是一種Python資料分析的利器,是一個開源的資料分析包,最初是應用於金融資料分析工具而開發出來的,因此pandas為時間序列分析提供了很好的支援。pandas是PyData專案的一部分。

安裝與匯入

安裝方式
Python的Anaconda發行版,已經安裝好pandas庫,不需要另外安裝
使用Anaconda介面安裝,選擇對應的pandas進行勾選安裝即可
使用Anaconda命令安裝:conda install pandas
使用PyPi安裝命令安裝:pip install pandas

匯入:

from pandas import Series, DataFrame
import pandas as pd  

Pandas的資料型別

Pandas基於兩種資料型別: series 與 dataframe 。

**Series:**一種類似於一維陣列的物件,是由一組資料(各種NumPy資料型別)以及一組與之相關的資料標籤(即索引)組成。僅由一組資料也可產生簡單的Series物件。注意:Series中的索引值是可以重複的。
**DataFrame:**一個表格型的資料結構,包含有一組有序的列,每列可以是不同的值型別(數值、字串、布林型等),DataFrame即有行索引也有列索引,可以被看做是由Series組成的字典。

Series

一個series是一個一維的資料型別,其中每一個元素都有一個標籤。類似於Numpy中元素帶標籤的陣列。其中,標籤可以是數字或者字串。

  • series屬性
編號 屬性或方法 描述
1 axes 返回行軸標籤列表。
2 dtype 返回物件的資料型別(dtype)。
3 empty 如果系列為空,則返回True。
4 ndim 返回底層資料的維數,預設定義:1。
5 size 返回基礎資料中的元素數。
6 values 將系列作為ndarray返回。
7 head() 返回前n行。
8 tail() 返回最後n行。
  • pandas.Series( data, index, dtype, copy)
編號 引數 描述
1 data 資料採取各種形式,如:ndarray,list,constants
2 index 索引值必須是唯一的和雜湊的,與資料的長度相同。 預設np.arange(n)如果沒有索引被傳遞。
3 dtype dtype用於資料型別。如果沒有,將推斷資料型別
4 copy 複製資料,預設為false。

建立series方式

通過一維陣列方式建立

import numpy as np  
import pandas as pd  

s = pd.Series([1, 2, 5, np.nan, 6, 8])  
print(s)  

輸出:

0    1.0  
1    2.0  
2    5.0  
3    NaN  
4    6.0  
5    8.0  
dtype: float64  

從ndarray建立一個系列

data = np.array(['a','b','c','d'])
ser02 = pd.Series(data)
ser02

#指定索引
data = np.array(['a','b','c','d'])
# ser02 = pd.Series(data,index=[100,101,102,103])
ser02 = pd.Series(data,index=['name','age','sex','address'])
ser02

輸出:

0    a
1    b
2    c
3    d
dtype: object

name       a
age        b
sex        c
address    d
dtype: object

從字典建立一個系列

字典(dict)可以作為輸入傳遞,如果沒有指定索引,則按排序順序取得字典鍵以構造索引。 如果傳遞了索引,索引中與標籤對應的資料中的值將被拉出。

data = {'a':1,'b':2,'c':3}
ser03 = pd.Series(data)
ser03

#指定索引
data = {'a':1,'b':2,'c':3}
ser03 = pd.Series(data,index = ['a','b','c','d'])
ser03

#標量建立
ser04 = pd.Series(5,index = [0,1,2,3])
ser04

輸出:

a    1
b    2
c    3
dtype: int64

a    1.0
b    2.0
c    3.0
d    NaN
dtype: float64

0    5
1    5
2    5
3    5
dtype: int64

Series值的獲取

Series值的獲取主要有兩種方式:

  • 通過方括號+索引的方式讀取對應索引的資料,有可能返回多條資料
  • 通過方括號+下標值的方式讀取對應下標值的資料,下標值的取值範圍為:[0,len(Series.values));另外下標值也可以是負數,表示從右往左獲取資料

Series獲取多個值的方式類似NumPy中的ndarray的切片操作,通過方括號+下標值/索引值+冒號(:)的形式來擷取series物件中的一部分數

#引入模組
import pandas as pd
import numpy as np
#檢索第一個元素。
ser05 = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(ser05[1])
print(ser05['a'])
print(ser05['d'])

輸出:

2
1
4
#檢索系列中的前三個元素
ser05 = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
#通過索引來獲取資料
print(ser05[:3])
print(ser05[::2])
print(ser05[4:2:-1])
#通過標籤(下標值)來獲取資料
print(ser05['b':'d'])
ser05['a':'d':2]
ser05['e':'c':-1]
ser05[['a','b']]

輸出:

a    1
b    2
c    3
dtype: int64
a    1
c    3
e    5
dtype: int64
e    5
d    4
dtype: int64
b    2
c    3
d    4
dtype: int64

a    1
b    2
dtype: int64

Series的運算

#引入模組
import pandas as pd
import numpy as np

series = pd.Series({'a':941,'b':431,'c':9327})
series

#輸出大於500的值
series[series>500]

#計算加
series+10

#計算減
series-100

#計算乘
series*10

#兩個系列相加
ser01 = pd.Series([1,2,3])
ser02 = pd.Series([4,5,6])
ser01+ser02

#)計算各個元素的指數e的x次方  e 約等於 2.71828
np.exp(series)

np.abs(series)

#sign()計算各個元素的正負號: 1 正數,0:零,-1:負數
np.sign(series)

Series自動對齊

當多個series物件之間進行運算的時候,如果不同series之間具有不同的索引值,那麼運算會自動對齊不同索引值的資料,如果某個series沒有某個索引值,那麼最終結果會賦值為NaN。

#引入模組
import pandas as pd
import numpy as np
serA = pd.Series([1,2,3],index = ['a','b','c'])
serB = pd.Series([4,5,6],index = ['b','c','d'])
print('---------serA+serB---------')
print(serA)
serA+serB

輸出:

---------serA+serB---------
a    1
b    2
c    3
dtype: int64

a    NaN
b    6.0
c    8.0
d    NaN
dtype: float64

Series及其索引的name屬性

Series物件本身以及索引都具有一個name屬性,預設為空,根據需要可以進行賦值操作

1.jpg

DataFrame

一個dataframe是一個二維的表結構。Pandas的dataframe可以儲存許多種不同的資料型別,並且每一個座標軸都有自己的標籤。你可以把它想象成一個series的字典項。

dataFrame屬性

編號 屬性或方法 描述
1 T 轉置行和列。
2 axes 返回一個列,行軸標籤和列軸標籤作為唯一的成員
3 dtypes 返回此物件中的資料型別(dtypes)。
4 empty 如果NDFrame完全為空[無專案],則返回為True; 如果任何軸的長度為0。
5 ndim 軸/陣列維度大小。
6 shape 返回表示DataFrame的維度的元組。
7 size NDFrame中的元素數。
8 values NDFrame的Numpy表示。
9 head() 返回開頭前n行。
10 tail() 返回最後n行。

####dataframe建立方式
pandas中的DataFrame可以使用以下建構函式建立

  • pandas.DataFrame( data, index, columns, dtype, copy)
編號 引數 描述
1 data 資料採取各種形式,如:ndarray,series,map,lists,dict,constant和另一個DataFrame。
2 index 對於行標籤,要用於結果幀的索引是可選預設值np.arrange(n),如果沒有傳遞索引值。
3 columns 對於列標籤,可選的預設語法是 - np.arange(n)。 這隻有在沒有索引傳遞的情況下才是這樣。
4 dtype 每列的資料型別。
5 copy 如果預設值為False,則此命令(或任何它)用於複製資料。

建立一個 DateFrame:

#建立日期索引序列  
dates =pd.date_range('20130101', periods=6)  
print(type(dates))  
#建立Dataframe,其中 index 決定索引序列,columns 決定列名  
df =pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))  
print(df) 

輸出:

<class 'pandas.core.indexes.datetimes.DatetimeIndex'>  
                   A         B         C         D  
2013-01-01  0.406575 -1.356139  0.188997 -1.308049  
2013-01-02 -0.412154  0.123879  0.907458  0.201024  
2013-01-03  0.576566 -1.875753  1.967512 -1.044405  
2013-01-04  1.116106 -0.796381  0.432589  0.764339  
2013-01-05 -1.851676  0.378964 -0.282481  0.296629  
2013-01-06 -1.051984  0.960433 -1.313190 -0.093666  

字典建立 DataFrame

df2 =pd.DataFrame({'A' : 1.,  
   'B': pd.Timestamp('20130102'),  
   'C': pd.Series(1,index=list(range(4)),dtype='float32'),  
   'D': np.array([3]*4,dtype='int32'),  
   'E': pd.Categorical(["test","train","test","train"]),  
   'F':'foo' })  

print(df2)  

輸出:

     A          B    C  D      E    F  
0  1.0 2013-01-02  1.0  3   test  foo  
1  1.0 2013-01-02  1.0  3  train  foo  
2  1.0 2013-01-02  1.0  3   test  foo  
3  1.0 2013-01-02  1.0  3  train  foo  

從列表建立DataFrame

data = [1,2,3,4]
df02 = pd.DataFrame(data)
df02

輸出:


	0
0 	1
1 	2
2 	3
3 	4

從列表字典來建立DataFrame

data = {'Name':['Tom','Jack','Steve'],'Age':[19,18,20]}
# df04 = pd.DataFrame(data)
#指定行索引和列索引
df04 = pd.DataFrame(data,index = ['rank1','rank2','rank3'],columns = ['Name','Age','Sex'])
df04

輸出:

 	Name 	Age 	Sex
rank1 	Tom 	19 	NaN
rank2 	Jack 	18 	NaN
rank3 	Steve 	20 	NaN

從字典列表建立資料幀DataFrame

data = [{'a':1,'b':2},{'a':1,'b':2,'c':3}]
# df05 = pd.DataFrame(data)
#傳遞字典列表指定行索引
# df05 = pd.DataFrame(data,index = ['first','second'])
#傳遞字典列表指定行索引,列索引
df05 = pd.DataFrame(data,index = ['first','second'],columns = ['a','b','c','d'])
df05

輸出:

 	a 	b 	c 	d
first 	1 	2 	NaN 	NaN
second 	1 	2 	3.0 	NaN

從系列的字典來建立DataFrame

data = {
    'one':pd.Series([1,2,3],index = ['a','b','c']),
    'two':pd.Series([1,2,3,4],index = ['a','b','c','d'])
}
df06 = pd.DataFrame(data)
df06

輸出:

 	one 	two
a 	1.0 	1
b 	2.0 	2
c 	3.0 	3
d 	NaN 	4

dataFrame資料操作

列選擇

#直接通過列索引來獲取某一列的值
data = {
    'one':pd.Series([1,2,3],index = ['a','b','c']),
    'two':pd.Series([1,2,3,4],index = ['a','b','c','d'])
}
df06 = pd.DataFrame(data)
df06

df06['one']
# df06.one
# df06.ix[:,'one']
# df06.loc[:,'one']
# df06.iloc[:,0]

列新增

data = {
    'one':pd.Series([1,2,3],index = ['a','b','c']),
    'two':pd.Series([1,2,3,4],index = ['a','b','c','d'])
}
df06 = pd.DataFrame(data)
df06['three'] = pd.Series([10,20,30],index = ['a','b','c'])
df06

列修改

#直接通過列名進行修改
df06['three'] = [7,8,9,10]
df06

列刪除

data = {
    'one':pd.Series([1,2,3],index = ['a','b','c']),
    'two':pd.Series([1,2,3,4],index = ['a','b','c','d']),
    'three':pd.Series([10,20,30],index = ['a','b','c'])
}
df06 = pd.DataFrame(data)
#使用del刪除列
# del(df06['three'])

#使用pop刪除
df06.pop('two')
df06

行選擇

data = {
    'one':pd.Series([1,2,3],index = ['a','b','c']),
    'two':pd.Series([1,2,3,4],index = ['a','b','c','d']),
    'three':pd.Series([10,20,30],index = ['a','b','c'])
}
df06 = pd.DataFrame(data)
df06

#可以通過將行標籤傳遞給loc函式或者ix函式來選擇行
# df06.loc['a']
df06.loc[:,'two']
# df06.ix['a']

# 按整數位置選擇
# 可以通過將整數位置傳遞給iloc函式來選擇行。參考以下示例程式碼 -
df06.iloc[2]

# 行切片
# 可以使用:運算子選擇多行。參考以下示例程式碼 -
df06[2:4]

行新增

# df06.ix['e'] = [22,33,444]
df06.loc['e'] = [22,33,444]
df06

# 新增加行
# 使用append()函式將新行新增到DataFrame。 此功能將附加行結束。
#建立一行資料
# data2 = pd.DataFrame([{'one':22,'two':33,'three':44}],index = ['e'])
data2 = pd.DataFrame([[22,33,44]],columns = ['one','two','three'],index = ['f'])
# data2 
df06 = df06.append(data2)
df06

行刪除

df06 = df06.drop('e')
df06