筆記|數(shù)據(jù)分析之pandas基礎(chǔ)----Series與DataFrame的基本功能(一)

pandas

重新索引

pandas對象的一個重要方法狡赐,其作用是創(chuàng)建一個適應(yīng)新索引的新對象栏豺。

reindex在Series上的應(yīng)用
In [3]: obj = Series([4.5, 7.2, -5.3, 3.6], index=['d','b','a','c'])

In [4]: obj
Out[4]:
d    4.5
b    7.2
a   -5.3
c    3.6
dtype: float64

In [5]: obj2 = reindex(['a', 'b', 'c', 'd', 'e'])

In [6]: obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'])

In [7]: obj2
Out[7]:
a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN   #如果新索引之前不存在,那么它的值就為缺失值
dtype: float64

Series的reindex函數(shù)將會根據(jù)新索引對數(shù)據(jù)重新排列窃诉,并且返回一個新的Series對象杨耙。如果某個索引不存在,那么它對應(yīng)的值就為缺失值飘痛。

如果想要對缺失值進(jìn)行補充珊膜,那么也有下面這幾個方法:

In [8]: obj.reindex(['a', 'b', 'c', 'd', 'e'],fill_value=0)
Out[8]:
a   -5.3
b    7.2
c    3.6
d    4.5
e    0.0
dtype: float64

這里直接預(yù)設(shè)了填充值為0,意味著該Series中所有的空缺值都將被替換成0
另外一種方法是:

obj3 = Series(['blue','purple','yellow'], index=[0, 2, 4])

In [10]: obj3.reindex(range(6), method='ffill')  # 'ffill'為前向填充宣脉,缺失值將前一位數(shù)據(jù)作為填充值车柠,反之就是后向填充'bfill'

Out[10]:
0      blue
1      blue
2    purple
3    purple
4    yellow
5    yellow
dtype: object

In [11]: obj3
Out[11]:
0      blue
2    purple
4    yellow
dtype: object

如果不想把填充值固定,也可以考慮使用method選項,它可以依據(jù)前后數(shù)據(jù)做填充處理竹祷。

reindex在DataFrame上的應(yīng)用

reindex不單可以修改行索引谈跛,也可以修改DataFrame的列索引

In [14]: frame = DataFrame(np.arange(9).reshape((3, 3)), index=['a', 'c', 'd'], columns=['Ohio', 'Texas', 'California'])

In [15]: frame
Out[15]:
   Ohio  Texas  California
a     0      1           2
c     3      4           5
d     6      7           8

In [16]: frame2 = frame.reindex(['a','b','c','d'])

In [17]: frame2
Out[17]:
   Ohio  Texas  California
a   0.0    1.0         2.0
b   NaN    NaN         NaN
c   3.0    4.0         5.0
d   6.0    7.0         8.0

同Series,在修改行索引的時候出現(xiàn)索引不存在的情況就會引入缺失值NaN塑陵。

如何重新索引列:

In [18]: states = ['Texas', 'Utah', 'California']

In [19]: frame.reindex(columns=states)
Out[19]:
   Texas  Utah  California
a      1   NaN           2
c      4   NaN           5
d      7   NaN           8

method插值能否同時對行列產(chǎn)生作用

In [38]: frame.reindex(index=['a','b','c','d'],method='ffill', columns = ['Texas','Utah','California'])

>>> index must be monotonic increasing or decreasing

按照書中的寫法感憾,發(fā)現(xiàn)在現(xiàn)在這個版本中已經(jīng)不適用了,會出現(xiàn)錯誤令花。在這個方法中如果存在插值屬性method吹菱,那行索引和列索引都將會被補充,但是在例子中列索引并不像行索引一樣是有序的彭则,所以才會出現(xiàn)這的錯誤鳍刷。

In [39]: frame.reindex(index=['a','b','c','d'], columns = ['Texas','Utah','California']).ffill()
Out[39]:
   Texas  Utah  California
a    1.0   NaN         2.0
b    1.0   NaN         2.0
c    4.0   NaN         5.0
d    7.0   NaN         8.0

改成這種寫法就可以了。

丟棄指定軸上的項

丟棄指定軸上的項drop()在清理數(shù)據(jù)中是一個非常重要的功能俯抖。

drop函數(shù)在Series上的應(yīng)用:

In [40]: obj = Series(np.arange(5.), index=['a','b','c','d','e'])

In [41]: new_obj = obj.drop('c')

In [42]: new_obj
Out[42]:
a    0.0
b    1.0
d    3.0
e    4.0
dtype: float64

當(dāng)然也可以同時刪除多個項:

In [43]: obj.drop(['d','c'])
Out[43]:
a    0.0
b    1.0
e    4.0
dtype: float64

drop函數(shù)在DataFrame上的應(yīng)用

In [45]: data = DataFrame(np.arange(16).reshape(4,4), index=['Ohio','Colorado','Utah','New York'], columns=['one','two','thre
    ...: e','four'])

In [46]: data
Out[46]:
          one  two  three  four
Ohio        0    1      2     3
Colorado    4    5      6     7
Utah        8    9     10    11
New York   12   13     14    15

In [47]: data.drop(['Colorado', 'Ohio'])
Out[47]:
          one  two  three  four
Utah        8    9     10    11
New York   12   13     14    15

如果是刪除行索引输瓜,同Series我們可以直接刪除任意一個或多個軸上的值。

如果要刪除列索引

In [50]: data.drop('two')

 >>> KeyError: "['two'] not found in axis"

它是不能直接刪除的芬萍,會出現(xiàn)報錯尤揣。意思是在默認(rèn)的軸上并沒有發(fā)現(xiàn)two這個索引。
因為dop函數(shù)默認(rèn)的軸是橫向的柬祠,如果想要刪除某個列就必須告訴它我要刪除縱向的軸北戏。可通過下面這個方式:

In [49]: data.drop('two', axis=1)
Out[49]:
          one  three  four
Ohio        0      2     3
Colorado    4      6     7
Utah        8     10    11
New York   12     14    15
In [51]: data.drop(['two','four'], axis=1)
Out[51]:
          one  three
Ohio        0      2
Colorado    4      6
Utah        8     10
New York   12     14

索引漫蛔、選區(qū)和過濾

Series最基本的索引:
In [52]: obj = Series(np.arange(4), index=['a','b','c','d'])

In [53]: obj['b']
Out[53]: 1

In [54]: obj[1]
Out[54]: 1
Series的切片索引嗜愈、選取和過濾:
In [55]: obj[2:4]   #切片索引
Out[55]:
c    2
d    3
dtype: int64

In [56]: obj[[1, 3]]  # 選取索引
Out[56]:
b    1
d    3
dtype: int64

In [57]: obj[obj < 2] #過濾
Out[57]:
a    0
b    1
dtype: int64

這里還有一種比較好玩的切片選取方式,就是利用標(biāo)簽來切片:

In [58]: obj['b':'c']
Out[58]:
b    1
c    2
dtype: int64

如果是用標(biāo)簽來切片的情況下莽龟,它與Python傳統(tǒng)切片不同蠕嫁,切片末端的數(shù)據(jù)也會被選取到。

DataFrame的切片索引毯盈、選取和過濾

DataFrame最基本的索引:

In [61]: data = DataFrame(np.arange(16).reshape((4,4)), index=['Ohio','Colorado','Utah','New York'], columns=['one','two','th
    ...: ree','four'])

In [62]: data
Out[62]:
          one  two  three  four
Ohio        0    1      2     3
Colorado    4    5      6     7
Utah        8    9     10    11
New York   12   13     14    15

In [63]: data['two']
Out[63]:
Ohio         1
Colorado     5
Utah         9
New York    13
Name: two, dtype: int64

In [64]: data[['three','two']]
Out[64]:
          three  two
Ohio          2    1
Colorado      6    5
Utah         10    9
New York     14   13

DataFrame的切片和過濾:

In [65]: data[:2]   #切片過程中剃毒,DataFrame默認(rèn)也是選取行
Out[65]:
          one  two  three  four
Ohio        0    1      2     3
Colorado    4    5      6     7

布爾型數(shù)組也是默認(rèn)選取行

In [66]: data[data['three'] > 5]
Out[66]:
          one  two  three  four
Colorado    4    5      6     7
Utah        8    9     10    11
New York   12   13     14    15

通過布爾型DataFrame進(jìn)行選取:

In [69]: data < 5
Out[69]:
            one    two  three   four
Ohio       True   True   True   True
Colorado   True  False  False  False
Utah      False  False  False  False
New York  False  False  False  False

再看一下data里有哪些數(shù)據(jù)是<5

In [70]: data[data < 5]
Out[70]:
          one  two  three  four
Ohio      0.0  1.0    2.0   3.0
Colorado  4.0  NaN    NaN   NaN
Utah      NaN  NaN    NaN   NaN
New York  NaN  NaN    NaN   NaN

把這些值全都改成0:

In [71]: data[data < 5] = 0

In [72]: data
Out[72]:
          one  two  three  four
Ohio        0    0      0     0
Colorado    0    5      6     7
Utah        8    9     10    11
New York   12   13     14    15

進(jìn)階選取搂赋,先選取列數(shù)據(jù)再選取行數(shù)據(jù):
在新版本pandas中赘阀,復(fù)雜的選取方式我們可以通過以下2種方式loc函數(shù)和iloc函數(shù)。

loc函數(shù)

loc函數(shù)有以下多種方式來選取以及過濾數(shù)據(jù)的:

  • 標(biāo)簽類型
  • 切片
  • 布爾值/邏輯判斷

它的語法為data.loc[<row selection>, <column selection>]

標(biāo)簽類型

In [75]: data.loc['Colorado',['two','three']]
Out[75]:
two      5
three    6
Name: Colorado, dtype: int64
In [101]: data.loc[:'Utah', 'two']
Out[101]:
Ohio        0
Colorado    5
Utah        9
Name: two, dtype: int64

切片

In [112]: data.loc['Utah',:'two']
Out[112]:
one    8
two    9
Name: Utah, dtype: int64

布爾值/邏輯判斷

In [116]: data.three > 5
Out[116]:
Ohio        False
Colorado     True
Utah         True
New York     True
Name: three, dtype: bool
In [115]: data.loc[data.three > 5]
Out[115]:
          one  two  three  four
Colorado    0    5      6     7
Utah        8    9     10    11
New York   12   13     14    15

由于data.three > 5最終會返回一個Series對象脑奠,DataFrame會通過這個布爾型Series來相互匹配選取布爾值True對應(yīng)的數(shù)據(jù)最終得到了過濾后的數(shù)據(jù)基公。

iloc函數(shù)

iloc函數(shù)則是基于整數(shù)參數(shù)來獲取數(shù)據(jù)的,它的語法為data.loc[<row selection>, <column selection>]

In [96]: data.iloc[2]
Out[96]:
one       8
two       9
three    10
four     11
Name: Utah, dtype: int64

單獨選擇了第三行捺信,返回UtahSeries對象酌媒。因為參數(shù)中是一個單獨的整數(shù)欠痴,所以iloc函數(shù)會返回Series對象。
如果想要它返回DataFrame對象秒咨,可以這么寫:

In [119]: data.iloc[[2]]
Out[119]:
      one  two  three  four
Utah    8    9     10    11

iloc函數(shù)中喇辽,傳入一個數(shù)組就可以了。

行列混合選扔晗:

In [117]: data.iloc[[0,1,2],[0,1]]
Out[117]:
          one  two
Ohio        0    0
Colorado    0    5
Utah        8    9

選取最后一行:

In [120]: data.iloc[-1]
Out[120]:
one      12
two      13
three    14
four     15
Name: New York, dtype: int64
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末菩咨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子陡厘,更是在濱河造成了極大的恐慌抽米,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糙置,死亡現(xiàn)場離奇詭異云茸,居然都是意外死亡,警方通過查閱死者的電腦和手機谤饭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門标捺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揉抵,你說我怎么就攤上這事亡容。” “怎么了冤今?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵闺兢,是天一觀的道長。 經(jīng)常有香客問我戏罢,道長屋谭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任帖汞,我火速辦了婚禮戴而,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘塑崖。我一直安慰自己嚎货,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盗誊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朱巨。 梳的紋絲不亂的頭發(fā)上他嫡,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音备籽,去河邊找鬼舶治。 笑死分井,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霉猛。 我是一名探鬼主播尺锚,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼惜浅!你這毒婦竟也來了瘫辩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤坛悉,失蹤者是張志新(化名)和其女友劉穎伐厌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裸影,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡挣轨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了轩猩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刃唐。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖界轩,靈堂內(nèi)的尸體忽然破棺而出画饥,到底是詐尸還是另有隱情,我是刑警寧澤浊猾,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布抖甘,位于F島的核電站,受9級特大地震影響葫慎,放射性物質(zhì)發(fā)生泄漏衔彻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一偷办、第九天 我趴在偏房一處隱蔽的房頂上張望艰额。 院中可真熱鬧,春花似錦椒涯、人聲如沸柄沮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祖搓。三九已至,卻和暖如春湖苞,著一層夾襖步出監(jiān)牢的瞬間拯欧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工财骨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留镐作,地道東北人藏姐。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像该贾,于是被迫代替她去往敵國和親羔杨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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