重新索引
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
單獨選擇了第三行捺信,返回Utah
的Series
對象酌媒。因為參數(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