Series和DataFrame的数据取值与选择
数据取值与选择
NumPy数据取值的方法,包括取值操作(如arr[2, 1])、切片操作(如arr[:, 1:5])、掩码操作(如arr[arr > 0])、花哨的索引操作(如arr[0, [1, 5]]),以及组合操作(如arr[:, [1, 5]])。
在NumPy的二维数组里,data[0]返回第一行,而在DataFrame中,data['col0']返回第一列。
import numpy as np
import pandas as pd
Series数据选择方法
将Series看作字典,
Series对象提供了键值对的映射。
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字典的表达式和方法来检测键/索引和值:
'a' in data
True
data.keys()
Index(['a', 'b', 'c', 'd'], dtype='object')
data.items()
list(data.items())
[('a', 0.25), ('b', 0.5), ('c', 0.75), ('d', 1.0)]
# 增加新的索引值扩展Series
data['e'] = 1.25
将Series看作一维数组,
具备和Numpy数组一样的数组数据选择功能,包括索引、掩码、花哨的索引操作。
# 将显式索引作为切片
data['a':'c']
a 0.25
b 0.50
c 0.75
dtype: float64
# 将隐式整数索引作为切片
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
当使用显式索引(即
data['a':'c'])作切片时,结果包含最后一个索引;而当使用隐式索引(即 data[0:2])
作切片时,结果不包含最后一个索引。
索引器:loc、iloc和ix,
如果Series是显式整数索引,那么data[1]这样的取值操作会使用显式索引,而data[1:3]这样的切片操作会使用隐式索引。
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对象的函数方法,而是暴露切片接口的属性。
第一种索引器是loc属性,表示取值和切片都是显式的:
data.loc[1]
'a'
data.loc[1:3]
1 a
3 b
dtype: object
第二种是iloc属性,表示取值和切片都是Python形式(从0开始,左闭右开区间)的隐式索引:
data.iloc[1]
'b'
data.iloc[1:3]
3 b
5 c
dtype: object
第三种取值属性是ix,它是前两种索引器的混合形式。在Series对象中ix等价于标准的[](Python列表)取值方式。
在处理整数索引的对象时,强烈推进使用索引器,可以让代码阅读和理解起来更容易,也能避免因误用索引/切片而产生的小bug。
DataFrame数据选择方法
将DataFrame看作字典,
把DataFrame当作一个由若干Series对象构成的字典。
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 |
两个Series分别构成DataFrame的一列,可以通过对列名进行字典型是的取值获取数据。
data['area']
Dongguan 33333
Foshan 22222
Guangzhou 55555
Shenzhen 44444
Zhuhai 11111
Name: area, dtype: int64
# 用字典形式语法调整对象
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看作二维数组,
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索引器,像对待Numpy数组一样索引Pandas的底层数组(Python的隐式索引),DataFrame的行列标签会自动保留在结果中。
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索引器实现混合效果
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开始,左闭右开区间)隐式索引。
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 |
如果对单个标签取值就选择列,而对多个标签用切片就选择行。
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 |
本文首发于steem,感谢阅读,转载请注明。
https://steemit.com/@padluo