1.pandas特性
對于python開發(fā)者來說权悟,在面對海量數(shù)據(jù)時(shí)氓鄙,pandas
可謂是數(shù)據(jù)分析的首選,以下關(guān)鍵特性是它如此熱門的原因:
1. 可以處理各種不同格式的數(shù)據(jù)集:時(shí)間序列禁灼,表格谤绳,矩陣數(shù)據(jù)
2. 促進(jìn)csv、DB/SQL等來源數(shù)據(jù)的加載/導(dǎo)入
3. 可以在很大數(shù)據(jù)集的基礎(chǔ)上進(jìn)行一些過濾塌计、合并挺身、切片等一系列操作
4. 可以根據(jù)使用的自定義的規(guī)則來處理缺失數(shù)據(jù)
...
更多信息可移步pandas進(jìn)一步了解。
1.1.安裝
# 可使用 anaconda 集成環(huán)境 自帶科學(xué)計(jì)算包
pip install pandas
1.2.說明
建議使用ipython
锌仅,本人使用jupyter notebook
2.pandas 數(shù)據(jù)結(jié)構(gòu)
看完本篇文章后章钾,您將了解以下數(shù)據(jù)結(jié)構(gòu):
1. pandas是基于NumPy構(gòu)建的,所以numpy.ndarray數(shù)據(jù)結(jié)構(gòu)必不可少
2. pandas.Series:一維數(shù)據(jù)結(jié)構(gòu)
3. pandas.DataFrame:二維數(shù)據(jù)結(jié)構(gòu)
4. pandas.Panel:三維數(shù)據(jù)結(jié)構(gòu)
2.1.NumPy ndarray
在數(shù)值計(jì)算中热芹,NumPy
非常重要贱傀,其中最重要的數(shù)據(jù)結(jié)構(gòu)便是ndarray多維數(shù)組對象,NumPy
提供了許多方法來創(chuàng)造數(shù)組剿吻。
首先導(dǎo)入numpy模塊
import numpy as np
2.1.1.numpy.array
data_01 = [0, 1, 2, 3]
data_02 = [-1, -2, 5.5, 6]
# 一維數(shù)組
arr_01 = np.array(data_01)
arr_01
out:
array([0, 1, 2, 3])
# 二維數(shù)組
arr_02 = np.array([data_01, data_02])
arr_02
out:
array([[ 0. , 1. , 2. , 3. ],
[-1. , -2. , 5.5, 6. ]])
# shape表示各維度大小的元組
arr_02.shape
out:
(2, 4)
# dtype說明數(shù)組數(shù)據(jù)類型的對象
arr_01.dtype
out:
dtype('int64')
arr_02.dtype
out:
dtype('float64')
# ndim表示數(shù)組的維度
arr_01.ndim
out:
1
arr_02.ndim
out:
2
2.1.2.numpy.arange
arr_03 = np.arange(12)
arr_03
out:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
# 可以設(shè)定條件 開始數(shù)值 結(jié)束數(shù)值 間隔數(shù)
arr_04 = np.arange(3, 10, 3)
arr_04
out:
array([3, 6, 9])
2.1.3.numpy.linspace
在設(shè)定的開始結(jié)束數(shù)值之間生成線性均勻間隔的元素
arr_05 = np.linspace(0, 2.0/3, 4)
arr_05
out:
array([ 0. , 0.22222222, 0.44444444, 0.66666667])
2.1.4.numpy.ones
# 看代碼就造用法了
arr_06 = np.ones((3, 3), dtype=np.int)
arr_06
out:
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
2.1.5.numpy.zeros
arr_07 = np.zeros((3, 3), dtype=np.int)
arr_07
out:
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
2.1.6.numpy.eye
arr_08 = np.eye(4, dtype=int)
arr_08
out:
array([[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
2.1.7.numpy.diag
arr_09 = np.diag((1, 2, 3, 4))
arr_09
out:
array([[1, 0, 0, 0],
[0, 2, 0, 0],
[0, 0, 3, 0],
[0, 0, 0, 4]])
arr_10 = np.diag(arr_09, k=1)
arr_10
out:
array([0, 0, 0])
2.1.8.numpy.random.randn
# 從標(biāo)準(zhǔn)正態(tài)分布中返回一個(gè)或多個(gè)樣本值
np.random.seed(100)
arr_11 = np.random.rand(4)
arr_11
out:
array([ 0.54340494, 0.27836939, 0.42451759, 0.84477613])
2.1.9.numpy.empty
arr_12 = np.empty((3, 2))
arr_12
out:
array([[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
2.1.10.numpy.tile
arr_02
out:
array([[ 0. , 1. , 2. , 3. ],
[-1. , -2. , 5.5, 6. ]])
arr_13 = np.tile(arr_02, 2)
arr_13
out:
array([[ 0. , 1. , 2. , 3. , 0. , 1. , 2. , 3. ],
[-1. , -2. , 5.5, 6. , -1. , -2. , 5.5, 6. ]])
2.1.11.NumPy datatypes
# int
arr_01
out:
array([0, 1, 2, 3])
# 自定義類型
arr_14 = np.arange(10, dtype='float')
arr_14
out:
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
out:
arr_15 = np.array(['hello','NumPy']);
arr_15.dtype
out:
dtype('<U5')
arr_16 = np.array([True, False])
arr_16.dtype
out:
dtype('bool')
# 修改類型
arr_17 = arr_16.astype(int)
arr_17
out:
array([1, 0])
2.1.12.Numpy indexing and slicing
arr_01
out:
array([0, 1, 2, 3])
tuple([arr_01[0],arr_01[1],arr_01[2],arr_01[-1]])
out:
(0, 1, 2, 3)
arr_02
out:
array([[ 0. , 1. , 2. , 3. ],
[-1. , -2. , 5.5, 6. ]])
arr_02[1,1]
out:
-2.0
# 翻轉(zhuǎn)第二行數(shù)組元素
arr_02[1,::-1]
out:
array([ 6. , 5.5, -2. , -1. ])
arr_02[1,0:3:2]
out:
array([-1. , 5.5])
2.1.13.Array masking
# 當(dāng)需要對數(shù)組進(jìn)行選擇或者過濾的時(shí)候窍箍,就可使用這個(gè)功能
# 隨機(jī)生成一組數(shù)據(jù)
arr_18 = np.random.randint(0,20,10)
arr_18
out:
array([ 2, 2, 2, 14, 2, 17, 16, 15, 4, 11])
# 獲取其中的偶數(shù) 首先將arr_18的數(shù)據(jù)掩飾成bool類型數(shù)據(jù)
evenMask = (arr_18 % 2 == 0)
# 只要是偶數(shù) 便返回True
evenMask
out:
array([ True, True, True, True, True, False, True, False, True, False], dtype=bool)
# 輸出偶數(shù)結(jié)果
arr_19 = arr_18[evenMask]
arr_19
out:
array([ 2, 2, 2, 14, 2, 16, 4])
2.1.14 Copies and views
當(dāng)我們對原始數(shù)據(jù)進(jìn)行切片操作,此時(shí)產(chǎn)生的視圖并沒有占有新的內(nèi)存丽旅。
arr_01
out:
array([0, 1, 2, 3])
arr_20 = arr_01[::2]
arr_20
out:
array([0, 2])
# 改變arr_20的值
arr_20[0] = 4
arr_20
out:
array([4, 2])
# arr_01的值同時(shí)發(fā)生改變
arr_01
out:
array([4, 1, 2, 3])
# 判斷兩個(gè)數(shù)組是不是處于同一內(nèi)存塊椰棘,可用np.may_share_memory方法
np.may_share_memory(arr_01, arr_20)
out:
True
np.may_share_memory(arr_18, arr_19)
out:
False
# np.copy
arr_21 = arr_01.copy()
arr_21
out:
array([4, 1, 2, 3])
# 改變arr_21的值
arr_21[0] = 0
arr_21
out:
array([0, 1, 2, 3])
# arr_01的值沒有發(fā)生改變
arr_01
out:
array([4, 1, 2, 3])
# 因?yàn)榇藭r(shí)他們分別處于不同的內(nèi)存塊
np.may_share_memory(arr_01, arr_21)
out:
False
2.1.15.Operations
# 這里隨便列出一些操作
arr_02
out:
array([[ 0. , 1. , 2. , 3. ],
[-1. , -2. , 5.5, 6. ]])
arr_02.T
out:
array([[ 0. , -1. ],
[ 1. , -2. ],
[ 2. , 5.5],
[ 3. , 6. ]])
np.transpose(arr_02)
out:
array([[ 0. , -1. ],
[ 1. , -2. ],
[ 2. , 5.5],
[ 3. , 6. ]])
arr_01
out:
array([4, 1, 2, 3])
arr_01.prod()
out:
24
np.prod(arr_02, axis=0)
out:
array([ -0., -2., 11., 18.])
np.all(arr_01 < 5)
out:
True
np.any(arr_01%2 == 0)
out:
True
2.1.16.Broadcasting
廣播指的是對不同形狀的數(shù)組進(jìn)行組合(或者說算術(shù)運(yùn)算)
arr_01
out:
array([4, 1, 2, 3])
arr_22 = np.ones([3,4])
arr_22
out:
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
arr_01 + arr_22
out:
array([[ 5., 2., 3., 4.],
[ 5., 2., 3., 4.],
[ 5., 2., 3., 4.]])
arr_23 = np.array([[1,2,3,4]])
arr_23
out:
array([[1, 2, 3, 4]])
arr_23.T + arr_23
out:
array([[2, 3, 4, 5],
[3, 4, 5, 6],
[4, 5, 6, 7],
[5, 6, 7, 8]])
2.1.17.Array shape manipulation
arr_02
out:
array([[ 0. , 1. , 2. , 3. ],
[-1. , -2. , 5.5, 6. ]])
arr_02.ravel()
out:
array([ 0. , 1. , 2. , 3. , -1. , -2. , 5.5, 6. ])
arr_02.flatten()
out:
array([ 0. , 1. , 2. , 3. , -1. , -2. , 5.5, 6. ])
arr_02.flatten('F')
out:
array([ 0. , -1. , 1. , -2. , 2. , 5.5, 3. , 6. ])
arr_01.reshape(2, 2)
out:
array([[4, 1],
[2, 3]])
arr_24 = np.arange(5)
arr_24.resize((8,))
arr_24
out:
array([0, 1, 2, 3, 4, 0, 0, 0])
# 增加維度
arr_25 = arr_24[:, np.newaxis]
arr_25
out:
array([[0],
[1],
[2],
[3],
[4],
[0],
[0],
[0]])
2.1.18.Array sorting
arr_01 = arr_01.reshape(2,2,)
arr_01
out:
array([[4, 1],
[2, 3]])
# 排序
arr_01.sort(axis=0)
arr_01
out:
array([[2, 1],
[4, 3]])
NumPy大概說到這里,具體請看NumPy進(jìn)一步了解榄笙。
2.2.Series
Series是一種類似于一維數(shù)組的對象邪狞,它由一組數(shù)據(jù)(NumPy數(shù)據(jù)類型)以及一組相關(guān)的標(biāo)簽(索引)組成。
# 導(dǎo)入包
import pandas as pd
# 創(chuàng)建Series數(shù)據(jù)類型
# ser=pd.Series(data, index=idx)
data可使用以下的任意一種:
1. ndarry
2. dict
3. scalar values
2.2.1.ndarry
ser_01 = pd.Series(np.random.rand(7), index=range(7))
ser_01
out:
0 0.209202
1 0.185328
2 0.108377
3 0.219697
4 0.978624
5 0.811683
6 0.171941
dtype: float64
2.2.2.dict
user = {'name':'howie', 'age':'21'}
ser_02 = pd.Series(user)
ser_02
out:
age 21
name howie
dtype: object
# 指定name index
ser_03 = pd.Series(user, index=['name', 'age', 'sex'], name='user')
# 不存在的index會返回NaN
ser_03
out:
name howie
age 21
sex NaN
Name: user, dtype: object
2.2.2.scalar values
這里需要注意的是index必須提供
ser_04 = pd.Series('hello', index=range(3))
ser_04
out:
0 hello
1 hello
2 hello
dtype: object
關(guān)于對Series的操作茅撞,其實(shí)和上述的numpy arrays類似帆卓,不過當(dāng)對其進(jìn)行切片時(shí),這同樣會影響到index
# 查看某個(gè)索引對應(yīng)的值
ser_02['name']
out:
'howie'
# 修改
ser_02['sex'] = 'man'
ser_02
out:
age 21
name howie
sex man
dtype: object
# 切片
ser_01[:4]
out:
0 0.209202
1 0.185328
2 0.108377
3 0.219697
dtype: float64
ser_01[ser_01 > 0.5]
out:
4 0.978624
5 0.811683
dtype: float64
2.3.DataFrame
DataFrame是一個(gè)表格型的數(shù)據(jù)結(jié)構(gòu)米丘,可以理解為一個(gè)二維的有標(biāo)簽的數(shù)組剑令。
下面介紹創(chuàng)建DataFrame的不同方式
2.3.1.Using dictionaries of Series
df_data_01 = {
'id': pd.Series([1, 2, 3, 4, 5]),
'name': pd.Series(['user_01', 'user_02', 'user_03', 'user_04', 'user_05']),
'age': pd.Series(np.random.randint(20,50,5))
}
df_01 = pd.DataFrame(df_data_01, columns=['id', 'name', 'age'])
df_01
df_01.columns
Index(['id', 'name', 'age'], dtype='object')
df_01.index
RangeIndex(start=0, stop=5, step=1)
2.3.2.Using a dictionary of ndarrays/lists
df_data_02 = {
'id': [1, 2, 3, 4, 5],
'name': ['user_01', 'user_02', 'user_03', 'user_04', 'user_05'],
'age': np.random.randint(20,50,5)
}
df_02 = pd.DataFrame(df_data_02, columns=['id', 'name', 'age'])
df_02
2.3.3.Using a structured array
df_data_03 = np.zeros((4,),dtype=[
('id', 'i1'),
('name', 'a10'),
('age', 'i4')
])
df_data_03[:] = [
(1,'user_01',10),
(2,'user_02',11),
(3,'user_03',12),
(4,'user_04',13)
]
df_03 = pd.DataFrame(df_data_03)
df_03
2.3.4.Using a Series structure
ser_02
out:
age 21
name howie
sex man
dtype: object
df_04 = pd.DataFrame(ser_02,columns=['user'])
df_04
除了以上方式生成DataFrame,還有一些其他方式拄查,比如直接從csv吁津、excel等直接提取生成。
# 一些基本操作
df_04['user']
age 21
name howie
sex man
Name: user, dtype: object
df_04['user']['age'] = 22
df_04
df_01.values
out:
array([[1, 'user_01', 41],
[2, 'user_02', 39],
[3, 'user_03', 24],
[4, 'user_04', 24],
[5, 'user_05', 47]], dtype=object)
del df_04['user']
df_04
# 插入一列
df_04.insert(0,'user',[21,'user_01','man'])
df_04
2.4.Panel
Panel是一個(gè)三維數(shù)組堕扶,它不像Series或者DataFrame那樣被廣泛使用碍脏,想象一下三維的三個(gè)軸,在Panel中分別如下:
1. items axis 0
2. major_axis axis 1
3. minor_axis axis 2
下面介紹Panel的創(chuàng)建方式:
2.4.1.Using 3D NumPy array with axis labels
# 創(chuàng)建一個(gè)三維數(shù)組
panel_data_01 = np.random.randn(2, 3, 4)
panel_data_01
out:
array([[[ 0.23784462, 0.01354855, -1.6355294 , -1.04420988],
[ 0.61303888, 0.73620521, 1.02692144, -1.43219061],
[-1.8411883 , 0.36609323, -0.33177714, -0.68921798]],
[[ 2.03460756, -0.55071441, 0.75045333, -1.30699234],
[ 0.58057334, -1.10452309, 0.69012147, 0.68689007],
[-1.56668753, 0.90497412, 0.7788224 , 0.42823287]]])
panel_01 = pd.Panel(panel_data_01,
items=['Item1', 'Item2'],
major_axis=pd.date_range('19/11/2016', periods=3),
minor_axis=['A', 'B', 'C', 'D']
)
panel_01
out:
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 3 (major_axis) x 4 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 2016-11-19 00:00:00 to 2016-11-21 00:00:00
Minor_axis axis: A to D
3.說明
筆記參考:
《Mastering Pandas》
《利用python進(jìn)行數(shù)據(jù)分析》
本次筆記主要記錄pandas
數(shù)據(jù)結(jié)構(gòu)稍算,接下來將詳細(xì)介紹用法典尾。
如果您也使用jupyter notebook
,可以下載本文源文件糊探,點(diǎn)擊這里