Series和DataFrame的数据取值与选择

in cn •  6 years ago 

数据取值与选择

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
data['b']
# 用Python字典的表达式和方法来检测键/索引和值:
'a' in data
data.keys()
data.items()
list(data.items())
# 增加新的索引值扩展Series
data['e'] = 1.25

将Series看作一维数组

具备和Numpy数组一样的数组数据选择功能,包括索引、掩码、花哨的索引操作。

# 将显式索引作为切片
data['a':'c']
# 将隐式整数索引作为切片
data[0:2]
# 掩码
data[(data > 0.3) & (data < 0.8)]
# 花哨的索引
data[['a', 'e']]

当使用显式索引(即
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
# 取值操作是显式索引
data[1]
# 切片操作是隐式索引
data[1:3]

Pandas提供的索引器(indexer)属性来取值的方法不是Series对象的函数方法,而是暴露切片接口的属性。

第一种索引器是loc属性,表示取值和切片都是显式的:

data.loc[1]
data.loc[1:3]

第二种是iloc属性,表示取值和切片都是Python形式(从0开始,左闭右开区间)的隐式索引:

data.iloc[1]
data.iloc[1:3]

第三种取值属性是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

两个Series分别构成DataFrame的一列,可以通过对列名进行字典型是的取值获取数据。

data['area']
# 用字典形式语法调整对象
data['density'] = data['pop']/data['area']
data

将DataFrame看作二维数组

data.values
data.T
data.values[0]
data['area']

Pandas索引器loc、iloc和ix

通过iloc索引器,像对待Numpy数组一样索引Pandas的底层数组(Python的隐式索引),DataFrame的行列标签会自动保留在结果中。

data.iloc[:3, :2]
data.loc[:'Guangzhou', :'pop']
# ix索引器实现混合效果
data.ix[:3, :'pop']

loc属性,表示取值和切片都是显式的。

data.loc[data.index[[0,2]], ['area', 'pop']]
data.loc[data.index[[0,2]], 'area':'pop']
data.loc[:, ['area', 'pop']]
data.loc[:'Guangzhou', :'pop']

iloc属性,表示取值和切片都是Python形式的(从0开始,左闭右开区间)隐式索引。

data.iloc[[0,2], data.columns.get_loc('pop')]
data.iloc[0:2, data.columns.get_indexer(['area', 'pop'])]
data.iloc[0:2, 0:2]

如果对单个标签取值就选择列,而对多个标签用切片就选择行。

data['area']
data['Dongguan':'Guangzhou']

本文首发于steem,感谢阅读,转载请注明。

https://steemit.com/@padluo


微信公众号「padluo」,分享数据科学家的自我修养,既然遇见,不如一起成长。

数据分析


读者交流电报群

https://t.me/sspadluo


知识星球交流群

知识星球读者交流群

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

@padluo, 写得太棒了,我喜欢!

@padluo, 我好欣赏你滴~~~ img

BTW, @cn-naughty.boy 淘气包,来,给MM来一点[还我漂漂拳]嘛,嘻嘻...