Numpy與Pandas使用

它們是什么?

NumPy是Python語言的一個擴充程序庫扒腕。支持高級大量的維度數(shù)組與矩陣運算寞钥,此外也針對數(shù)組運算提供大量的數(shù)學函數(shù)庫。

Pandas是基于NumPy 的一種工具雷激,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。Pandas 納入了大量庫和一些標準的數(shù)據(jù)模型告私,提供了高效地操作大型數(shù)據(jù)集所需的工具屎暇。Pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。

List驻粟、Numpy與Pandas

Numpy與List

相同之處:

  • 都可以用下標訪問元素根悼,例如a[0]
  • 都可以切片訪問,例如a[1:3]
  • 都可以使用for循環(huán)進行遍歷

不同之處:

  • Numpy之中每個元素類型必須相同格嗅;而List中可以混合多個類型元素
  • Numpy使用更方便番挺,封裝了許多函數(shù),例如mean屯掖、std、sum襟衰、min贴铜、max等
  • Numpy可以是多維數(shù)組
  • Numpy用C實現(xiàn),操作起來速度更快

Pandas與Numpy

相同之處:

  • 訪問元素一樣瀑晒,可以使用下標绍坝,也可以使用切片訪問
  • 可以使用For循環(huán)遍歷
  • 有很多方便的函數(shù),例如mean苔悦、std轩褐、sum、min玖详、max等
  • 可以進行向量運算
  • 用C實現(xiàn)把介,速度更快

不同之處:Pandas擁有Numpy一些沒有的方法,例如describe函數(shù)蟋座。其主要區(qū)別是:Numpy就像增強版的List拗踢,而Pandas就像列表和字典的合集,Pandas有索引向臀。

Numpy使用

1巢墅、基本操作

import numpy as np

#創(chuàng)建Numpy
p1 = np.array([1, 2, 3])
print p1
print p1.dtype
[1 2 3]
int64
#求平均值
print p1.mean()
2.0
#求標準差
print p1.std()
0.816496580928
#求和、求最大值、求最小值
print p1.sum()
print p1.max()
print p1.min()
6
3
1
#求最大值所在位置
print p1.argmax()
2

2君纫、向量運算

p1 = np.array([1, 2, 3])
p2 = np.array([2, 5, 7])
#向量相加驯遇,各個元素相加
print p1 + p2
[ 3  7 10]
#向量乘以1個常數(shù)
print p1 * 2
[2 4 6]
#向量相減
print p1 - p2
[-1 -3 -4]
#向量相乘,各個元素之間做運算
print p1 * p2
[ 2 10 21]
#向量與一個常數(shù)比較
print p1 > 2
[False False  True]

3蓄髓、索引數(shù)組

首先叉庐,看下面一幅圖,理解下



然后双吆,咱們用代碼實現(xiàn)看下

a = np.array([1, 2, 3, 4, 5])
print a
[1 2 3 4 5]
b = a > 2
print b
[False False  True  True  True]
print a[b]
[3 4 5]

a[b]中眨唬,只會保留a中所對應(yīng)的b位置為True的元素

4、原地與非原地

咱們先來看一組運算:

a = np.array([1, 2, 3, 4])
b = a
a += np.array([1, 1, 1, 1])
print b
    [2 3 4 5]
a = np.array([1, 2, 3, 4])
b = a
a = a + np.array([1, 1, 1, 1])
print b
    [1 2 3 4]

從上面結(jié)果可以看出來好乐,+=改變了原來數(shù)組匾竿,而+沒有。這是因為:

  • +=:它是原地計算蔚万,不會創(chuàng)建一個新的數(shù)組岭妖,在原始數(shù)組中更改元素
  • +:它是非原地計算,會創(chuàng)建一個新的數(shù)組反璃,不會修改原始數(shù)組中的元素

5昵慌、Numpy中的切片與List的切片

l1 = [1, 2, 3, 5]
l2 = l1[0:2]
l2[0] = 5
print l2
print l1
[5, 2]
[1, 2, 3, 5]
p1 = np.array([1, 2, 3, 5])
p2 = p1[0:2]
p2[0] = 5
print p1
print p2
[5 2 3 5]
[5 2]

從上可知,List中改變切片中的元素淮蜈,不會影響原來的數(shù)組斋攀;而Numpy改變切片中的元素,原來的數(shù)組也跟著變了梧田。這是因為:Numpy的切片編程不會創(chuàng)建一個新數(shù)組出來淳蔼,當修改對應(yīng)的切片也會更改原始的數(shù)組數(shù)據(jù)。這樣的機制裁眯,可以讓Numpy比原生數(shù)組操作更快鹉梨,但編程時需要注意。

6穿稳、二維數(shù)組的操作

p1 = np.array([[1, 2, 3], [7, 8, 9], [2, 4, 5]])
#獲取其中一維數(shù)組
print p1[0]
[1 2 3]
#獲取其中一個元素存皂,注意它可以是p1[0, 1],也可以p1[0][1]
print p1[0, 1]
print p1[0][1]
2
2
#求和是求所有元素的和
print p1.sum()
41
[10 14 17]

但逢艘,當設(shè)置axis參數(shù)時旦袋,當設(shè)置為0時,是計算每一列的結(jié)果埋虹,然后返回一個一維數(shù)組猜憎;若是設(shè)置為1時,則是計算每一行的結(jié)果搔课,然后返回一維數(shù)組胰柑。對于二維數(shù)組截亦,Numpy中很多函數(shù)都可以設(shè)置axis參數(shù)。

#獲取每一列的結(jié)果
print p1.sum(axis=0)
[10 14 17]
#獲取每一行的結(jié)果
print p1.sum(axis=1)
[ 6 24 11]
#mean函數(shù)也可以設(shè)置axis
print p1.mean(axis=0)
[ 3.33333333  4.66666667  5.66666667]

Pandas使用

Pandas有兩種結(jié)構(gòu)柬讨,分別是Series和DataFrame崩瓤。其中Series擁有Numpy的所有功能,可以認為是簡單的一維數(shù)組踩官;而DataFrame是將多個Series按列合并而成的二維數(shù)據(jù)結(jié)構(gòu)却桶,每一列單獨取出來是一個Series。

咱們主要梳理下Numpy沒有的功能:

1蔗牡、簡單基本使用

import pandas as pd

pd1 = pd.Series([1, 2, 3])
print pd1
    0    1
    1    2
    2    3
    dtype: int64
#也可以求和和標準偏差
print pd1.sum()
print pd1.std()
    6
    1.0

2颖系、索引

(1)Series中的索引

p1 = pd.Series(
    [1, 2, 3],
    index = ['a', 'b', 'c']
)
print p1
    a    1
    b    2
    c    3
    dtype: int64
print p1['a']
    1

(2)DataFrame數(shù)組

p1 = pd.DataFrame({
    'name': ['Jack', 'Lucy', 'Coke'],
    'age': [18, 19, 21]
})
print p1
       age  name
    0   18  Jack
    1   19  Lucy
    2   21  Coke
#獲取name一列
print p1['name']
    0    Jack
    1    Lucy
    2    Coke
    Name: name, dtype: object
#獲取姓名的第一個
print p1['name'][0]
    Jack
#使用p1[0]不能獲取第一行,但是可以使用iloc
print p1.iloc[0]
    age       18
    name    Jack
    Name: 0, dtype: object

總結(jié):

  • 獲取一列使用p1['name']這種索引
  • 獲取一行使用p1.iloc[0]

3辩越、apply使用

apply可以操作Pandas里面的元素嘁扼,當庫里面沒用對應(yīng)的方法時,可以通過apply來進行封裝

def func(value):
    return value * 3
pd1 = pd.Series([1, 2, 5])
print pd1.apply(func)
    0     3
    1     6
    2    15
    dtype: int64

同樣可以在DataFrame上使用:

pd2 = pd.DataFrame({
    'name': ['Jack', 'Lucy', 'Coke'],
    'age': [18, 19, 21]
})
print pd2.apply(func)
       age          name
    0   54  JackJackJack
    1   57  LucyLucyLucy
    2   63  CokeCokeCoke

4黔攒、axis參數(shù)

Pandas設(shè)置axis時趁啸,與Numpy有點區(qū)別:

  • 當設(shè)置axis為'columns'時,是計算每一行的值
  • 當設(shè)置axis為'index'時督惰,是計算每一列的值
pd2 = pd.DataFrame({
    'weight': [120, 130, 150],
    'age': [18, 19, 21]
})
    0    138
    1    149
    2    171
    dtype: int64
#計算每一行的值
print pd2.sum(axis='columns')
    0    138
    1    149
    2    171
    dtype: int64
#計算每一列的值
print pd2.sum(axis='index')
    age        58
    weight    400
    dtype: int64

5不傅、分組

pd2 = pd.DataFrame({
    'name': ['Jack', 'Lucy', 'Coke', 'Pol', 'Tude'],
    'age': [18, 19, 21, 21, 19]
})
#以年齡分組
print pd2.groupby('age').groups
    {18: Int64Index([0], dtype='int64'), 19: Int64Index([1, 4], dtype='int64'), 21: Int64Index([2, 3], dtype='int64')}

6、向量運算

需要注意的是赏胚,索引數(shù)組相加時访娶,對應(yīng)的索引相加

pd1 = pd.Series(
    [1, 2, 3],
    index = ['a', 'b', 'c']
)

pd2 = pd.Series(
    [1, 2, 3],
    index = ['a', 'c', 'd']
)
print pd1 + pd2
    a    2.0
    b    NaN
    c    5.0
    d    NaN
    dtype: float64

出現(xiàn)了NAN值,如果我們期望NAN不出現(xiàn)觉阅,如何處理震肮?使用add函數(shù),并設(shè)置fill_value參數(shù)

print pd1.add(pd2, fill_value=0)
    a    2.0
    b    2.0
    c    5.0
    d    3.0
    dtype: float64

同樣留拾,它可以應(yīng)用在Pandas的dataFrame中,只是需要注意列與行都要對應(yīng)起來鲫尊。

總結(jié)

這一周學習了優(yōu)達學城上分析基礎(chǔ)的課程痴柔,使用的是Numpy與Pandas。對于Numpy疫向,以前在Tensorflow中用過咳蔚,但是很不明白,這次學習之后搔驼,才知道那么簡單谈火,算是有一定的收獲。

參考

Pandas 使用指南(上) 基本數(shù)據(jù)結(jié)構(gòu)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舌涨,一起剝皮案震驚了整個濱河市糯耍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖温技,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件革为,死亡現(xiàn)場離奇詭異,居然都是意外死亡舵鳞,警方通過查閱死者的電腦和手機震檩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜓堕,“玉大人抛虏,你說我怎么就攤上這事√撞牛” “怎么了迂猴?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長霜旧。 經(jīng)常有香客問我错忱,道長,這世上最難降的妖魔是什么挂据? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任以清,我火速辦了婚禮,結(jié)果婚禮上崎逃,老公的妹妹穿的比我還像新娘掷倔。我一直安慰自己,他們只是感情好个绍,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布勒葱。 她就那樣靜靜地躺著,像睡著了一般巴柿。 火紅的嫁衣襯著肌膚如雪凛虽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天广恢,我揣著相機與錄音凯旋,去河邊找鬼。 笑死钉迷,一個胖子當著我的面吹牛至非,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糠聪,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼荒椭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了舰蟆?” 一聲冷哼從身側(cè)響起趣惠,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤狸棍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后信卡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隔缀,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年傍菇,在試婚紗的時候發(fā)現(xiàn)自己被綠了猾瘸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡丢习,死狀恐怖牵触,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咐低,我是刑警寧澤揽思,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站见擦,受9級特大地震影響钉汗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鲤屡,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一损痰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酒来,春花似錦卢未、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翘鸭,卻和暖如春滴铅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背就乓。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工失息, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人档址。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像邻梆,于是被迫代替她去往敵國和親守伸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

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