第3章 Pandas資料處理(3.3)_Python資料科學手冊學習筆記
阿新 • • 發佈:2018-12-13
3.3 資料取值與選擇
第2章回顧:
- NumPy中取值操作: arr[2,1]
- 切片操作: arr[:,1:5]
- 掩碼操作: arr[arr>0]
- 花哨的索引操作: arr[0,[1,5]]
- 組合操作: arr[:,[1:5]]
3.3.1 Series資料選擇方法
Series物件和一維的NumPy陣列和標準的Python字典在許多方面都一樣.
將Series看作字典
import pandas as pd
data = pd.Series([0.25,0.5,0.75,1],
index=['a','b','c','d'])
data
a 0.25 b 0.50 c 0.75 d 1.00 dtype: float64
data['b']
0.5
還可以用Python字典的表示式和方法來檢測鍵/索引的值:
'a' in data
True
data.keys()
Index(['a', 'b', 'c', 'd'], dtype='object')
list(data.items())
[('a', 0.25), ('b', 0.5), ('c', 0.75), ('d', 1.0)]
Series還可以通過字典語法調整資料. 就像可以通過新加鍵擴充套件字典一樣, Series中可以通過增加新的索引值擴充套件Series.
data['e'] = 1.25
data
a 0.25 b 0.50 c 0.75 d 1.00 e 1.25 dtype: float64
data['a'] = 100
data
a 100.00
b 0.50
c 0.75
d 1.00
e 1.25
dtype: float64
將Series看作是一個數組
- 包括索引,掩碼,花俏索引等操作
將顯示索引作為切片
data['a':'c']
a 100.00
b 0.50
c 0.75
dtype: float64
將隱式索引作為切片
data[0:2]
a 100.0
b 0.5
dtype: float64
當使用顯示索引做切片時, 結果包含最後一個索引, 當使用隱式索引切片時,結果不包含最後一個索引.
掩碼
# data[data > 0.3 & data < 0.8] 此語句報錯
data[(data > 0.3) & (data < 0.8)]
b 0.50
c 0.75
dtype: float64
花哨的索引
data[['a','c']]
# data[('a','c')]報錯
a 100.00
c 0.75
dtype: float64
索引器: loc, iloc和ix
- 如果Series是顯示整數索引, 那麼data[1]這樣的取值操作會使用顯示索引, 而data[1;3]這樣的操作會用隱式索引.
- 由於整數索引會造成混亂, 索引Pandas提供了一個索引器(indexer).
- 它們不是Series物件的函式方法, 而是暴露切片介面的屬性.
loc屬性, 表示取值和切片都是顯式的
import numpy as np
import pandas as pd
data = pd.Series(['a','b','c'], index=[1,2,5])
data.loc[1]
'a'
data.loc[1:3]
1 a
2 b
dtype: object
iloc屬性,表示取值和切片都是Python的隱式索引
data.iloc[1]
'b'
data.iloc[1:3]
2 b
5 c
dtype: object
ix屬性, 前兩種索引的混合使用. 主要用於DataFrame中. Python中程式碼設計原則:顯式由於隱式.
3.3.2 DataFrame資料選擇方法
- DtaFrame像二維或者結構化陣列
- 又像一個共享索引的若干Series物件構成的字典
將DataFrame看作字典
area = pd.Series({'a':123,'b':456,'c':236,'d':333})
pop = pd.Series({'a':222,'b':4226,'c':2236,'d':3233})
data = pd.DataFrame({'area':area,'pop':pop})
data
area | pop | |
---|---|---|
a | 123 | 222 |
b | 456 | 4226 |
c | 236 | 2236 |
d | 333 | 3233 |
data['area']
a 123
b 456
c 236
d 333
Name: area, dtype: int64
data.area # 避免使用此方法, 可能和方法重名
a 123
b 456
c 236
d 333
Name: area, dtype: int64
增加一列
data['den'] = data['area'] / data['pop']
data
area | pop | den | |
---|---|---|---|
a | 123 | 222 | 0.554054 |
b | 456 | 4226 | 0.107903 |
c | 236 | 2236 | 0.105546 |
d | 333 | 3233 | 0.103000 |
將DataFrame看作二維陣列
- 將DataFrame看成一個增強版的二維陣列, 用values屬性按行檢視陣列資料
data.values # 下面這啥格式?
array([[1.23000000e+02, 2.22000000e+02, 5.54054054e-01],
[4.56000000e+02, 4.22600000e+03, 1.07903455e-01],
[2.36000000e+02, 2.23600000e+03, 1.05545617e-01],
[3.33000000e+02, 3.23300000e+03, 1.03000309e-01]])
行列轉置 (大寫T)
data.T
a | b | c | d | |
---|---|---|---|---|
area | 123.000000 | 456.000000 | 236.000000 | 333.000 |
pop | 222.000000 | 4226.000000 | 2236.000000 | 3233.000 |
den | 0.554054 | 0.107903 | 0.105546 | 0.103 |
data.values[0] # 獲取某行資料
array([123. , 222. , 0.55405405])
data['area'] # 獲取某列資料
a 123
b 456
c 236
d 333
Name: area, dtype: int64
data.iloc[:3,:2] # 隱式索引,前3行前2列
area | pop | |
---|---|---|
a | 123 | 222 |
b | 456 | 4226 |
c | 236 | 2236 |
data.loc[:'b',:'pop']
area | pop | |
---|---|---|
a | 123 | 222 |
b | 456 | 4226 |
混合索引
data.ix[:3,:'pop']
D:\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: DeprecationWarning:
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing
See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated
"""Entry point for launching an IPython kernel.
area | pop | |
---|---|---|
a | 123 | 222 |
b | 456 | 4226 |
c | 236 | 2236 |
data.iloc[0,2] = 1000 # 修改值
data
area | pop | den | |
---|---|---|---|
a | 123 | 222 | 1000.000000 |
b | 456 | 4226 | 0.107903 |
c | 236 | 2236 | 0.105546 |
d | 333 | 3233 | 0.103000 |
其他取值方法
data['b':'c']
area | pop | den | |
---|---|---|---|
b | 456 | 4226 | 0.107903 |
c | 236 | 2236 | 0.105546 |
data[1:3]
area | pop | den | |
---|---|---|---|
b | 456 | 4226 | 0.107903 |
c | 236 | 2236 | 0.105546 |
data[data.den>100]
area | pop | den | |
---|---|---|---|
a | 123 | 222 | 1000.0 |