Series和DataFrame的數(shù)據(jù)取值與選擇
數(shù)據(jù)取值與選擇
NumPy數(shù)據(jù)取值的方法扬跋,包括取值操作(如arr[2, 1])栗菜、切片操作(如arr[:, 1:5])筋粗、掩碼操作(如arr[arr > 0])芭析、花哨的索引操作(如arr[0, [1, 5]])晌砾,以及組合操作(如arr[:, [1, 5]])。
在NumPy的二維數(shù)組里担忧,data[0]返回第一行芹缔,而在DataFrame中,data['col0']返回第一列瓶盛。
import numpy as np
import pandas as pd
Series數(shù)據(jù)選擇方法
將Series看作字典最欠,
Series對(duì)象提供了鍵值對(duì)的映射。
data = pd.Series(np.linspace(0.25, 1, 4), 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字典的表達(dá)式和方法來檢測鍵/索引和值:
'a' in data
True
data.keys()
Index(['a', 'b', 'c', 'd'], dtype='object')
data.items()
<zip at 0x84775c8>
list(data.items())
[('a', 0.25), ('b', 0.5), ('c', 0.75), ('d', 1.0)]
# 增加新的索引值擴(kuò)展Series
data['e'] = 1.25
將Series看作一維數(shù)組惩猫,
具備和Numpy數(shù)組一樣的數(shù)組數(shù)據(jù)選擇功能芝硬,包括索引、掩碼轧房、花哨的索引操作拌阴。
# 將顯式索引作為切片
data['a':'c']
a 0.25
b 0.50
c 0.75
dtype: float64
# 將隱式整數(shù)索引作為切片
data[0:2]
a 0.25
b 0.50
dtype: float64
# 掩碼
data[(data > 0.3) & (data < 0.8)]
b 0.50
c 0.75
dtype: float64
# 花哨的索引
data[['a', 'e']]
a 0.25
e 1.25
dtype: float64
當(dāng)使用顯式索引(即
data['a':'c'])作切片時(shí),結(jié)果包含最后一個(gè)索引奶镶;而當(dāng)使用隱式索引(即 data[0:2])
作切片時(shí)迟赃,結(jié)果不包含最后一個(gè)索引。
索引器:loc厂镇、iloc和ix纤壁,
如果Series是顯式整數(shù)索引,那么data[1]這樣的取值操作會(huì)使用顯式索引剪撬,而data[1:3]這樣的切片操作會(huì)使用隱式索引摄乒。
data = pd.Series(['a', 'b', 'c'], index=(1, 3, 5))
data
1 a
3 b
5 c
dtype: object
# 取值操作是顯式索引
data[1]
'a'
# 切片操作是隱式索引
data[1:3]
3 b
5 c
dtype: object
Pandas提供的索引器(indexer)屬性來取值的方法不是Series對(duì)象的函數(shù)方法,而是暴露切片接口的屬性残黑。
第一種索引器是loc屬性,表示取值和切片都是顯式的:
data.loc[1]
'a'
data.loc[1:3]
1 a
3 b
dtype: object
第二種是iloc屬性斋否,表示取值和切片都是Python形式(從0開始梨水,左閉右開區(qū)間)的隱式索引:
data.iloc[1]
'b'
data.iloc[1:3]
3 b
5 c
dtype: object
第三種取值屬性是ix,它是前兩種索引器的混合形式茵臭。在Series對(duì)象中ix等價(jià)于標(biāo)準(zhǔn)的[](Python列表)取值方式疫诽。
在處理整數(shù)索引的對(duì)象時(shí),強(qiáng)烈推進(jìn)使用索引器旦委,可以讓代碼閱讀和理解起來更容易奇徒,也能避免因誤用索引/切片而產(chǎn)生的小bug。
DataFrame數(shù)據(jù)選擇方法
將DataFrame看作字典缨硝,
把DataFrame當(dāng)作一個(gè)由若干Series對(duì)象構(gòu)成的字典摩钙。
area = pd.Series({'Guangzhou':55555, 'Shenzhen':44444, 'Dongguan':33333, 'Foshan':22222, 'Zhuhai':11111})
pop = pd.Series({'Guangzhou':51, 'Shenzhen':42, 'Dongguan':33, 'Foshan':24, 'Zhuhai':15})
data = pd.DataFrame({'area':area, 'pop':pop})
data
area | pop | |
---|---|---|
Dongguan | 33333 | 33 |
Foshan | 22222 | 24 |
Guangzhou | 55555 | 51 |
Shenzhen | 44444 | 42 |
Zhuhai | 11111 | 15 |
兩個(gè)Series分別構(gòu)成DataFrame的一列,可以通過對(duì)列名進(jìn)行字典型是的取值獲取數(shù)據(jù)查辩。
data['area']
Dongguan 33333
Foshan 22222
Guangzhou 55555
Shenzhen 44444
Zhuhai 11111
Name: area, dtype: int64
# 用字典形式語法調(diào)整對(duì)象
data['density'] = data['pop']/data['area']
data
area | pop | density | |
---|---|---|---|
Dongguan | 33333 | 33 | 0.000990 |
Foshan | 22222 | 24 | 0.001080 |
Guangzhou | 55555 | 51 | 0.000918 |
Shenzhen | 44444 | 42 | 0.000945 |
Zhuhai | 11111 | 15 | 0.001350 |
將DataFrame看作二維數(shù)組胖笛,
data.values
array([[ 3.33330000e+04, 3.30000000e+01, 9.90009900e-04],
[ 2.22220000e+04, 2.40000000e+01, 1.08001080e-03],
[ 5.55550000e+04, 5.10000000e+01, 9.18009180e-04],
[ 4.44440000e+04, 4.20000000e+01, 9.45009450e-04],
[ 1.11110000e+04, 1.50000000e+01, 1.35001350e-03]])
data.T
Dongguan | Foshan | Guangzhou | Shenzhen | Zhuhai | |
---|---|---|---|---|---|
area | 33333.00000 | 22222.00000 | 55555.000000 | 44444.000000 | 11111.00000 |
pop | 33.00000 | 24.00000 | 51.000000 | 42.000000 | 15.00000 |
density | 0.00099 | 0.00108 | 0.000918 | 0.000945 | 0.00135 |
data.values[0]
array([ 3.33330000e+04, 3.30000000e+01, 9.90009900e-04])
data['area']
Dongguan 33333
Foshan 22222
Guangzhou 55555
Shenzhen 44444
Zhuhai 11111
Name: area, dtype: int64
Pandas索引器loc网持、iloc和ix,
通過iloc索引器长踊,像對(duì)待Numpy數(shù)組一樣索引Pandas的底層數(shù)組(Python的隱式索引)功舀,DataFrame的行列標(biāo)簽會(huì)自動(dòng)保留在結(jié)果中。
data.iloc[:3, :2]
area | pop | |
---|---|---|
Dongguan | 33333 | 33 |
Foshan | 22222 | 24 |
Guangzhou | 55555 | 51 |
data.loc[:'Guangzhou', :'pop']
area | pop | |
---|---|---|
Dongguan | 33333 | 33 |
Foshan | 22222 | 24 |
Guangzhou | 55555 | 51 |
# ix索引器實(shí)現(xiàn)混合效果
data.ix[:3, :'pop']
D:\Anaconda3\envs\py36env\lib\site-packages\ipykernel_launcher.py:2: 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
area | pop | |
---|---|---|
Dongguan | 33333 | 33 |
Foshan | 22222 | 24 |
Guangzhou | 55555 | 51 |
loc屬性身弊,表示取值和切片都是顯式的辟汰。
data.loc[data.index[[0,2]], ['area', 'pop']]
area | pop | |
---|---|---|
Dongguan | 33333 | 33 |
Guangzhou | 55555 | 51 |
data.loc[data.index[[0,2]], 'area':'pop']
area | pop | |
---|---|---|
Dongguan | 33333 | 33 |
Guangzhou | 55555 | 51 |
data.loc[:, ['area', 'pop']]
area | pop | |
---|---|---|
Dongguan | 33333 | 33 |
Foshan | 22222 | 24 |
Guangzhou | 55555 | 51 |
Shenzhen | 44444 | 42 |
Zhuhai | 11111 | 15 |
data.loc[:'Guangzhou', :'pop']
area | pop | |
---|---|---|
Dongguan | 33333 | 33 |
Foshan | 22222 | 24 |
Guangzhou | 55555 | 51 |
iloc屬性,表示取值和切片都是Python形式的(從0開始阱佛,左閉右開區(qū)間)隱式索引帖汞。
data.iloc[[0,2], data.columns.get_loc('pop')]
Dongguan 33
Guangzhou 51
Name: pop, dtype: int64
data.iloc[0:2, data.columns.get_indexer(['area', 'pop'])]
area | pop | |
---|---|---|
Dongguan | 33333 | 33 |
Foshan | 22222 | 24 |
data.iloc[0:2, 0:2]
area | pop | |
---|---|---|
Dongguan | 33333 | 33 |
Foshan | 22222 | 24 |
如果對(duì)單個(gè)標(biāo)簽取值就選擇列,而對(duì)多個(gè)標(biāo)簽用切片就選擇行瘫絮。
data['area']
Dongguan 33333
Foshan 22222
Guangzhou 55555
Shenzhen 44444
Zhuhai 11111
Name: area, dtype: int64
data['Dongguan':'Guangzhou']
area | pop | density | |
---|---|---|---|
Dongguan | 33333 | 33 | 0.000990 |
Foshan | 22222 | 24 | 0.001080 |
Guangzhou | 55555 | 51 | 0.000918 |
本文首發(fā)于steem涨冀,感謝閱讀,轉(zhuǎn)載請注明麦萤。