數(shù)據(jù)分析之四:pandas庫之索引對象和數(shù)學(xué)統(tǒng)計(jì)

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)行索引切片的重要方法

  1. Positional-oriented (Python slicing style : exclusive of end)
  2. Label-oriented (Non-Python slicing style : inclusive of end)
  3. 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ì)算也很方便竹揍,使用corrcov函數(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末霜浴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蓝纲,更是在濱河造成了極大的恐慌阴孟,老刑警劉巖晌纫,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異永丝,居然都是意外死亡锹漱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門慕嚷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哥牍,“玉大人,你說我怎么就攤上這事喝检⌒崂保” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵挠说,是天一觀的道長澡谭。 經(jīng)常有香客問我,道長损俭,這世上最難降的妖魔是什么蛙奖? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮杆兵,結(jié)果婚禮上雁仲,老公的妹妹穿的比我還像新娘。我一直安慰自己拧咳,他們只是感情好伯顶,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骆膝,像睡著了一般祭衩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阅签,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天掐暮,我揣著相機(jī)與錄音,去河邊找鬼政钟。 笑死路克,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的养交。 我是一名探鬼主播精算,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碎连!你這毒婦竟也來了灰羽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廉嚼,沒想到半個(gè)月后玫镐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怠噪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年恐似,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傍念。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡矫夷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捂寿,到底是詐尸還是另有隱情口四,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布秦陋,位于F島的核電站蔓彩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驳概。R本人自食惡果不足惜赤嚼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顺又。 院中可真熱鬧更卒,春花似錦、人聲如沸稚照。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽果录。三九已至上枕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間弱恒,已是汗流浹背辨萍。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留返弹,地道東北人锈玉。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像义起,于是被迫代替她去往敵國和親拉背。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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