1. 程式人生 > >第3章 Pandas資料處理(3.3)_Python資料科學手冊學習筆記

第3章 Pandas資料處理(3.3)_Python資料科學手冊學習筆記

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