以前在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’])方法就是用來讀取列的,如果修改[ ]裏面的值爲字段名稱或者列的索引名稱,沒有明確的指定就會報錯。