Mastering Pandas 01

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
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
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
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
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_04_01
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_02
# 插入一列
df_04.insert(0,'user',[21,'user_01','man'])
df_04
df_04_03

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)擊這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钾埂,一起剝皮案震驚了整個(gè)濱河市河闰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勃教,老刑警劉巖淤击,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異故源,居然都是意外死亡污抬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門绳军,熙熙樓的掌柜王于貴愁眉苦臉地迎上來印机,“玉大人,你說我怎么就攤上這事门驾∩淙” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵奶是,是天一觀的道長楣责。 經(jīng)常有香客問我,道長聂沙,這世上最難降的妖魔是什么秆麸? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮及汉,結(jié)果婚禮上沮趣,老公的妹妹穿的比我還像新娘。我一直安慰自己坷随,他們只是感情好房铭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著温眉,像睡著了一般缸匪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上类溢,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天凌蔬,我揣著相機(jī)與錄音,去河邊找鬼豌骏。 笑死龟梦,一個(gè)胖子當(dāng)著我的面吹牛隐锭,可吹牛的內(nèi)容都是我干的窃躲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钦睡,長吁一口氣:“原來是場噩夢啊……” “哼蒂窒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洒琢,失蹤者是張志新(化名)和其女友劉穎秧秉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衰抑,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡象迎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呛踊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砾淌。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谭网,靈堂內(nèi)的尸體忽然破棺而出汪厨,到底是詐尸還是另有隱情,我是刑警寧澤愉择,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布劫乱,位于F島的核電站,受9級特大地震影響锥涕,放射性物質(zhì)發(fā)生泄漏衷戈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一站楚、第九天 我趴在偏房一處隱蔽的房頂上張望脱惰。 院中可真熱鬧,春花似錦窿春、人聲如沸拉一。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔚润。三九已至,卻和暖如春尺栖,著一層夾襖步出監(jiān)牢的瞬間嫡纠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工延赌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留除盏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓挫以,卻偏偏與公主長得像者蠕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子掐松,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容