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屬性,預設為空,根據需要可以進行賦值操作
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