Series索引(obj[...])的工作方式類似于NumPy數(shù)組的索引,只不過Series的索引值不只是整數(shù)。下面是幾個(gè)例子:
In [117]: obj = pd.Series(np.arange(4.), index=['a', 'b', 'c', 'd'])
In [118]: obj
Out[118]:
a 0.0
b 1.0
c 2.0
d 3.0
dtype: float64
In [119]: obj['b']
Out[119]: 1.0
In [120]: obj[1]
Out[120]: 1.0
In [121]: obj[2:4]
Out[121]:
c 2.0
d 3.0
dtype: float64
In [122]: obj[['b', 'a', 'd']]
Out[122]:
b 1.0
a 0.0
d 3.0
dtype: float64
In [123]: obj[[1, 3]]
Out[123]:
b 1.0
d 3.0
dtype: float64
In [124]: obj[obj < 2]
Out[124]:
a 0.0
b 1.0
dtype: float64
利用標(biāo)簽的切片運(yùn)算與普通的Python切片運(yùn)算不同,其末端是包含的:
In [125]: obj['b':'c']
Out[125]:
b 1.0
c 2.0
dtype: float64
用切片可以對(duì)Series的相應(yīng)部分進(jìn)行設(shè)置:
In [126]: obj['b':'c'] = 5
In [127]: obj
Out[127]:
a 0.0
b 5.0
c 5.0
d 3.0
dtype: float64
用一個(gè)值或序列對(duì)DataFrame進(jìn)行索引其實(shí)就是獲取一個(gè)或多個(gè)列:
In [128]: data = pd.DataFrame(np.arange(16).reshape((4, 4)),
.....: index=['Ohio', 'Colorado', 'Utah', 'New York'],
.....: columns=['one', 'two', 'three', 'four'])
In [129]: data
Out[129]:
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 [130]: data['two']
Out[130]:
Ohio 1
Colorado 5
Utah 9
New York 13
Name: two, dtype: int64
In [131]: data[['three', 'one']]
Out[131]:
three one
Ohio 2 0
Colorado 6 4
Utah 10 8
New York 14 12
這種索引方式有幾個(gè)特殊的情況。首先通過切片或布爾型數(shù)組選取數(shù)據(jù):
In [132]: data[:2]
Out[132]:
one two three four
Ohio 0 1 2 3
Colorado 4 5 6 7
In [133]: data[data['three'] > 5]
Out[133]:
one two three four
Colorado 4 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
選取行的語(yǔ)法data[:2]十分方便。向[ ]傳遞單一的元素或列表,就可選擇列。
另一種用法是通過布爾型DataFrame(比如下面這個(gè)由標(biāo)量比較運(yùn)算得出的)進(jìn)行索引:
In [134]: data < 5
Out[134]:
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
In [135]: data[data < 5] = 0
In [136]: data
Out[136]:
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
另一種用法是通過布爾型DataFrame(比如下面這個(gè)由標(biāo)量比較運(yùn)算得出的)進(jìn)行索引:
In [134]: data < 5
Out[134]:
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
In [135]: data[data < 5] = 0
In [136]: data
Out[136]:
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
這使得DataFrame的語(yǔ)法與NumPy二維數(shù)組的語(yǔ)法很像。
前面的索引值基本都是唯一的,即索引元素沒有重復(fù)項(xiàng)。雖然許多pandas函數(shù)(如reindex)都要求標(biāo)簽唯一,但這并不是強(qiáng)制性的。我們來看看下面這個(gè)簡(jiǎn)單的帶有重復(fù)索引值的Series:
In [222]: obj = pd.Series(range(5), index=['a', 'a', 'b', 'b', 'c'])
In [223]: obj
Out[223]:
a 0
a 1
b 2
b 3
c 4
dtype: int64
索引的is_unique屬性可以告訴你它的值是否是唯一的:
In [224]: obj.index.is_unique
Out[224]: False
對(duì)于帶有重復(fù)值的索引,數(shù)據(jù)選取的行為將會(huì)有些不同。如果某個(gè)索引對(duì)應(yīng)多個(gè)值,則返回一個(gè)Series;而對(duì)應(yīng)單個(gè)值的,則返回一個(gè)標(biāo)量值:
In [225]: obj['a']
Out[225]:
a 0
a 1
dtype: int64
In [226]: obj['c']
Out[226]: 4
這樣會(huì)使代碼變復(fù)雜,因?yàn)樗饕妮敵鲱愋蜁?huì)根據(jù)標(biāo)簽是否有重復(fù)發(fā)生變化。
對(duì)DataFrame的行進(jìn)行索引時(shí)也是如此:
In [227]: df = pd.DataFrame(np.random.randn(4, 3), index=['a', 'a', 'b', 'b'])
In [228]: df
Out[228]:
0 1 2
a 0.274992 0.228913 1.352917
a 0.886429 -2.001637 -0.371843
b 1.669025 -0.438570 -0.539741
b 0.476985 3.248944 -1.021228
In [229]: df.loc['b']
Out[229]:
0 1 2
b 1.669025 -0.438570 -0.539741
b 0.476985 3.248944 -1.021228
所以盡量保證索引的唯一性可以更好地處理數(shù)據(jù),減少工作量。
基本上和純python還有numpy對(duì)數(shù)組的操作一樣,沒啥需要解釋的內(nèi)容。
文章代碼引用自:《利用Python進(jìn)行數(shù)據(jù)分析·第2版》第5章 Pandas入門
作者:SeanCheney
感謝SeanCheney同意引用。