1. pandas的索引對象
任何數(shù)組都有一個(gè)Index對象外驱,可以為DataFrame設(shè)置各種各樣的Index璧尸,如DatetimeIndex可以用來表示時(shí)間戳窜护,MultiIndex可以表示層次索引助赞,這些Index的基類是Index买羞,可以通過以下方式查看Index:
In [227]: frame
Out[227]:
0 1 2
0 1 1 1
1 2 2 2
2 3 3 3
# 此DataFrame的索引是RangeIndex類型
In [228]: frame.index
Out[228]: RangeIndex(start=0, stop=3, step=1)
# 可以通過以下方式修改索引
In [230]: frame.index = ['a','b','c']
In [231]: frame
Out[231]:
0 1 2
a 1 1 1
b 2 2 2
c 3 3 3
In [232]: frame.index
Out[232]: Index([u'a', u'b', u'c'], dtype='object')
# 但是不可以這樣,因?yàn)镮ndex對象不支持這種修改方式
In [233]: idx = frame.index
In [234]: idx[0] = 'A'
1.1. 重新索引
In [258]: arr = Series(randn(4), index=['b', 'c', 'a', 'd'])
In [259]: arr
Out[259]:
b 0.048503
c -2.836523
a 0.231643
d 1.272932
dtype: float64
# 重新索引后雹食,索引值跟著索引改變了位置
In [260]: arr1 = arr.reindex(['a', 'b', 'c', 'd', 'e'])
In [261]: arr1
Out[261]:
a 0.231643
b 0.048503
c -2.836523
d 1.272932
e NaN
dtype: float64
In [264]: frame = DataFrame(np.arange(9).reshape((3,3)), columns=['b', 'a', 'c'])
In [265]: frame
Out[265]:
b a c
0 0 1 2
1 3 4 5
2 6 7 8
# 同樣畜普,可以重排列索引,也可以同時(shí)對行和列重排
In [266]: frame.reindex(columns=['a', 'b', 'c', 'd'])
Out[266]:
a b c d
0 1 0 2 NaN
1 4 3 5 NaN
2 7 6 8 NaN
1.2. 通過索引刪除
# 先來看缺省值的刪除
In [269]: frame
Out[269]:
a b c d
0 1 0 2 NaN
1 4 3 5 NaN
2 7 6 8 NaN
# 參數(shù)為1軸婉徘,表示刪除1軸上帶有缺省值NaN的一列
# 若參數(shù)為0軸漠嵌,刪除所有值得到一個(gè)空的frame?
In [270]: frame.dropna(axis=1)
Out[270]:
a b c
0 1 0 2
1 4 3 5
2 7 6 8
# drop函數(shù)盖呼,默認(rèn)參數(shù)是行索引儒鹿,即index
In [275]: frame.drop(0)
Out[275]:
a b c d
1 4 3 5 NaN
2 7 6 8 NaN
# 若刪除列,請指定軸方向
n [277]: frame.drop('d', axis=1)
Out[277]:
a b c
0 1 0 2
1 4 3 5
2 7 6 8
1.3. 通過索引過濾
In [278]: frame
Out[278]:
a b c d
0 1 0 2 NaN
1 4 3 5 NaN
2 7 6 8 NaN
# 獲取b列小于4的行
In [280]: frame[frame['b'] < 4]
Out[280]:
a b c d
0 1 0 2 NaN
1 4 3 5 NaN
# 獲取b列小于4且c列小于3的行
# 這里‘&’代表and几晤,‘|’代表or
In [281]: frame[(frame['b'] < 4) & (frame['c'] < 3)]
Out[281]:
a b c d
0 1 0 2 NaN
1.4. 通過索引排序
對行和列的索引進(jìn)行排序使用sort_index
函數(shù)约炎,返回一個(gè)新的對象,若需要按值排序蟹瘾,Series使用order
函數(shù)圾浅,DataFrame使用sort_values
函數(shù),排序的時(shí)候憾朴,缺省值默認(rèn)是放到末尾的狸捕。
In [294]: frame = DataFrame(np.arange(8).reshape(2,4), index=[3, 1], columns=['d', 'b', 'a', 'c'])
In [295]: frame
Out[295]:
d b a c
3 0 1 2 3
1 4 5 6 7
# 按照index升序排列
In [296]: frame.sort_index()
Out[296]:
d b a c
1 4 5 6 7
3 0 1 2 3
# 按照column生序排列
In [297]: frame.sort_index(axis=1)
Out[297]:
a b c d
3 2 1 3 0
1 6 5 7 4
# 同時(shí)按照行和列排序
In [299]: frame.sort_index(axis=1).sort_index()
Out[299]:
a b c d
1 6 5 7 4
3 2 1 3 0
# 按值排序,需指定軸方向和基準(zhǔn)列
In [311]: frame
Out[311]:
d b a c
1 4 5 6 7
3 0 1 2 3
In [312]: frame.sort_values(by='c', axis=0)
Out[312]:
d b a c
3 0 1 2 3
1 4 5 6 7
1.5 通過索引定位和切片
- loc/iloc/ix方式
loc众雷、iloc以及ix都是定位DataFrame行以及進(jìn)行索引切片的重要方法
- Positional-oriented (Python slicing style : exclusive of end)
- Label-oriented (Non-Python slicing style : inclusive of end)
- General (Either slicing style : depends on if the slice contains labels or positions)
分別解釋一下
iloc是基于位置的索引灸拍,參數(shù)只允許是RowID這樣的整數(shù),例如砾省,選取第1-2行使用
df.loc[1:3]
鸡岗,注意第3行是不包含的(滿足python style);loc是基于標(biāo)簽的索引编兄,也就是我們自定義的索引轩性,同樣選取第1-2行使用
df.loc[1:2]
,注意它不滿足python style狠鸳;ix是以上二者的綜合揣苏,既可以使用RowID悯嗓,又可以使用自定義索引,要視情況不同來使用舒岸,如果索引既有數(shù)字又有英文绅作,那么這種方式是不建議使用的,很容易導(dǎo)致定位的混亂蛾派,可以想象俄认,如果索引是
A, B, C, D, 1, 2, 3
,我們使用切片df.ix[:3]
是否能得到我們想要的樣子呢洪乍?
所以眯杏,建議大家養(yǎng)成習(xí)慣,活用loc和iloc即可壳澳,附帶loc切片選取數(shù)據(jù)塊的方法:
可以再研究下它們的效率岂贩,例如讀取一個(gè)30k條記錄的數(shù)據(jù)集,使用以下三種方式進(jìn)行切片操作巷波,效率相差不是很大萎津,官方文檔也未說明他們在效率上有何不同,以后可以使用更大的數(shù)據(jù)集來做實(shí)驗(yàn)抹镊,畢竟數(shù)據(jù)分析方面效率也是很重要的指標(biāo)谷朝,選取的方法好了梅惯,工作效率也更高。
In [42]: %timeit df.ix[:10]
10000 loops, best of 3: 138 μs per loop
In [43]: %timeit df.loc[:10]
The slowest run took 4.89 times longer than the fastest. This could mean that an intermediate result is being cached.
10000 loops, best of 3: 140 μs per loop
In [44]: %timeit df.iloc[:11]
10000 loops, best of 3: 130 μs per loop
2. pandas統(tǒng)計(jì)
一次性對所有列產(chǎn)生匯總統(tǒng)計(jì)可以用describe
函數(shù),包括數(shù)量count
(非NA)站叼,平均值 mean
原茅,最小值min
澈蟆,最大值max
翔忽,分位數(shù)quantile
(25%/50%/75%),標(biāo)準(zhǔn)差std
等铃彰,當(dāng)然也可以調(diào)用相應(yīng)的方法單獨(dú)求出绍豁,默認(rèn)不加參數(shù)都是對列操作。
例如牙捉,對以下3×4的矩陣:
In [314]: frame = DataFrame(randn(3, 4))
In [315]: frame
Out[315]:
0 1 2 3
0 0.143605 0.543037 1.509424 -0.849529
1 1.516573 -1.037837 -0.323093 -0.380521
2 -0.488021 -1.007932 -0.751957 1.693078
In [316]: frame.describe()
Out[316]:
0 1 2 3
count 3.000000 3.000000 3.000000 3.000000
mean 0.390719 -0.500911 0.144791 0.154343
std 1.024889 0.904209 1.201103 1.353060
min -0.488021 -1.037837 -0.751957 -0.849529
25% -0.172208 -1.022885 -0.537525 -0.615025
50% 0.143605 -1.007932 -0.323093 -0.380521
75% 0.830089 -0.232447 0.593165 0.656278
max 1.516573 0.543037 1.509424 1.693078
In [317]: frame.max()
Out[317]:
0 1.516573
1 0.543037
2 1.509424
3 1.693078
dtype: float64
In [318]: frame.count()
Out[318]:
0 3
1 3
2 3
3 3
dtype: int64
In [319]: frame.sum()
Out[319]:
0 1.172157
1 -1.502732
2 0.434374
3 0.463028
dtype: float64
相關(guān)系數(shù)和協(xié)方差的計(jì)算也很方便竹揍,使用corr
和cov
函數(shù)即可
In [321]: frame = DataFrame({'col1':[1,3,4,3,4],'col2':[2,3,1,2,3],'col3':[1,5,2,4,4]})
In [322]: frame
Out[322]:
col1 col2 col3
0 1 2 1
1 3 3 5
2 4 1 2
3 3 2 4
4 4 3 4
# 列之間的相關(guān)系數(shù)
# 默認(rèn)參數(shù)method='pearson',此外還有kendall鹃共,spearman
In [323]: frame.corr()
Out[323]:
col1 col2 col3
col1 1.000000 0.000000 0.496904
col2 0.000000 1.000000 0.691023
col3 0.496904 0.691023 1.000000
# 列之間的協(xié)方差
In [324]: frame.cov()
Out[324]:
col1 col2 col3
col1 1.5 0.00 1.00
col2 0.0 0.70 0.95
col3 1.0 0.95 2.70
# 也可以單指定某一列計(jì)算
In [331]: frame.corrwith(frame.col1)
Out[331]:
col1 1.000000
col2 0.000000
col3 0.496904
dtype: float64
還有一個(gè)計(jì)算頻率的方法value_counts
,和apply
函數(shù)結(jié)合使用驶拱,可以實(shí)現(xiàn)wordcount
In [336]: wordcounts = frame.apply(pd.value_counts).fillna(0)
# 左列是矩陣中的不同元素
In [337]: wordcounts
Out[337]:
col1 col2 col3
1 1.0 1.0 1.0
2 0.0 2.0 1.0
3 2.0 2.0 0.0
4 2.0 0.0 2.0
5 0.0 0.0 1.0