第八篇,數據分析之pandas的數據索引和切片

以前在Numpy寫過索引和切片可以參考Numpy的操作

Series對象

首先導入我們的Numpy與Pandas
import pandas as pd
import numpy as np

a = np.array([2345,6789,1234,5678])
b = pd.Series(a,index=['python','java','html','c'])
print(b['java'])
print('java' in b)
print('hadoop' in b)
print(b.keys())
6789
True
False
Index(['python', 'java', 'html', 'c'], dtype='object')

不難看出來在[ ]裏面放置的是標籤索引的一個值,類似於數組中用整數作爲下標。比如b[‘java’],就是以某一個標籤索引下標獲得其對應的數據。索引與數據之間這種映射類似於python中的字典對象key與value之間的關係,所以也可以使用一些字典的方法。
附加:

b['hadoop'] = 9874 #增加一個
print(b)
c = b['java':'hadoop'] #獲取到數據的下標,前包括,後也包括
print(c)
python    2345
java      6789
html      1234
c         5678
hadoop    9874
dtype: int64
java      6789
html      1234
c         5678
hadoop    9874
dtype: int64

注意這裏,你會發現,他並沒有遵守Python序列的“前包括,後不包括”的規則,它是包括了結束標籤索引的值。還有一個區別,就是它每次切出來的部分生成了一個新的對象,沒有那種Numpy中所謂的“共用視圖”,可以觀察一下代碼。

c['spark'] = 5432
print(c)
print(b)
java      6789
html      1234
c         5678
hadoop    9874
spark     5432
dtype: int64
python    2345
java      6789
html      1234
c         5678
hadoop    9874
dtype: int64

重點又來了如下代碼,還是跟着上面代碼後面寫

print(b[2])
print(b[1:4])
1234
java    6789
html    1234
c       5678
dtype: int64

你會突然發現,根據下標的位置索引又按照"前包括,後不包括"的方式了,這個時候我們可以寫個測試的方法如下。

d = pd.Series(np.random.rand(4),index=[1,3,5,7])
print(d)
print(d[1])
print(d[1:3])
1    0.373752
3    0.227697
5    0.825495
7    0.152058
dtype: float64
0.3737523265812278
3    0.227697
5    0.825495
dtype: float64

可以看出來,上面的d[1]中這個1按我們之前寫的應該是位置索引啊,怎麼看起來是標籤索引,那再看看d[1:3],怎麼裏面的1又變成了位置索引了,這個時候是不是覺得很亂,於是針對索引有個專門的方法。跟着上面繼續寫。

print(d)
print(d.iloc[1])
print(d.iloc[1:3])
1    0.446437
3    0.341855
5    0.298457
7    0.448216
dtype: float64
0.34185531311777173
3    0.341855
5    0.298457
dtype: float64

這個series.iloc[ ]方法裏面只接收位置索引,如果想通過位置索引獲得某個數據,這個方法還是很好用的,當然肯定也有我們的標籤索引如下。這些方法不僅適用於Series對象還適用於DataFrame對象。

print(d.loc[1:3])

1    0.564683
3    0.727926
dtype: float64

根據MultiIndex對象切片:

a = [('book',2015),('book',2016),('teacher',2015),('teacher',2016)]
b = pd.MultiIndex.from_tuples(a)
c = pd.Series([2500,2600,2700,2800],index=b)
print(c['book']) #返回一個Series對象
print(c.loc['book'])
print(c.iloc[0]) #返回第一個數值
print(c.loc['book',2016]) #深入到第一級索引
print(c.loc[:,2015]) #獲取所有標籤爲2015的數值
2015    2500
2016    2600
dtype: int64
2015    2500
2016    2600
dtype: int64
2500
2600
book       2500
teacher    2700
dtype: int64

DataFrame對象

a = pd.Series([2014,2015,2016],index=['java','python','hadoop'])
b = pd.Series([12345,23456,56789],index=['java','python','hadoop'])
c = pd.DataFrame({'gdp':b,'pop':a})
print(c)
print(c['gdp'])
print(c.iloc[1]) #接收的是位置索引,DataFrame就變成了一個二維數組
print(c.iloc[1,1])
print(c.loc['java'])
print(c['java':'python'])#前包括,後也包括
          gdp   pop
java    12345  2014
python  23456  2015
hadoop  56789  2016

java      12345
python    23456
hadoop    56789
Name: gdp, dtype: int64

gdp    23456
pop     2015
Name: python, dtype: int64

2015

gdp    12345
pop     2014
Name: java, dtype: int64

          gdp   pop
java    12345  2014
python  23456  2015

注意:Series對象是一維的,只有一個方向的索引,而DataFrame則有兩個維度,於是print(c[‘gdp’])方法就是用來讀取列的,如果修改[ ]裏面的值爲字段名稱或者列的索引名稱,沒有明確的指定就會報錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章