python数据科学(七) Pandas(二) 数据取值与选择

本文最后更新于:2023年4月15日 晚上

嫌一直记笔记效率太低, 之后的pandas内容都在本地的jupyter notebook上敲代码和markdown说明

python数据科学(七) Pandas(二) 数据取值与选择

1 | Series数据选择方法

Series对象与一维Numpy数组和标准python字典在很多方面都一样

1-1 | 将Series看作字典

  • 键值对的映射
1
2
data['b']
# 0.5
  • 字典表达式检测键值
1
2
3
4
5
6
7
8
'a' in data
# True

data.keys()
# Index(['a', 'b', 'c'], dtype='object')

list(data.items())
# [('a', 1), ('b', 2), ('c', 3)]
  • 通过字典语法调整数据
1
data['e'] = 0.5  # 新增

1-2 | 将Series看作一维数组

同样支持花哨索引, 掩码等等, 具备和Numpy数组一样的数组数据选择功能

显式索引切片和隐式索引切片的区别

1
2
3
4
# 显式索引切片
data['a':'c'] # 取值区间: [a,c]
# 隐式索引切片
data[0:2] # 取值区间: [0, 2)

二者的区别: 显式索引切片为左闭右闭区间, 隐式索引切片为左闭右开区间

1-3 | 索引器: loc, iloc和ix

切片和取值的习惯用法经常会导致混乱, 比如Series是显式整数索引, 那么data[1]这样的取值为显式索引而data[1:2]这样的切片为隐式索引, 由于整数索引易造成混淆, python提供了索引器属性来作为取值的方法, 它们不是Series对象的函数方法, 而是暴露切片接口的属性

loc索引器

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"""
data:
1 a
2 b
3 c
dtype: object
"""
data.loc[1] # 'a'

data.loc[1:3]
"""
1 a
2 b
3 c
dtype: object
"""

iloc索引器

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"""
data:
1 a
2 b
3 c
dtype: object
"""
data.iloc[1] # 'b'

data.iloc[1:3]
"""
2 b
3 c
dtype: object
"""

ix索引器

主要适用于DataFrame对象, 下文详述

Python代码的设计原则之一就是“显式优于隐式”, 使用loc和iloc让代码更容易维护, 可读性更高, 使用loc和iloc可以让代码阅读和理解更容易, 也可以避免因误用索引/切片而产生的bug

2 | DataFrame数据选择方法

2-1 | 将DataFrame看作字典

  • 使用字典形式获取数据
1
2
3
4
5
6
7
8
9
10
11
12
13
"""
population area
湖南 1000 1A
广东 2000 2B
上海 10000 3C
"""
state['area']
"""
湖南 1A
广东 2B
上海 3C
Name: area, dtype: object
"""
  • 使用属性形式获取纯字符串列名数据
1
state.area  # 等价于state['area']

注意: 属性形式获取只能是纯字符串列名, 且不能与方法名重名

2-2 | 将DataFrame看作二维数组

通过values属性可以查看数组数据

1
2
3
4
5
6
7
8
state.values
"""
array([[1000, '1A'],
[2000, '2B'],
[10000, '3C']], dtype=object)
"""
state.values[0]
# array([1000, '1A'], dtype=object)

同样地, 使用loc和iloc处理显式索引和隐式索引

1
2
3
4
5
6
7
8
9
10
11
12
state.loc[:'广东', :'area']
"""
population area
湖南 1000 1A
广东 2000 2B
"""
state.iloc[:2, :1]
"""
population
湖南 1000
广东 2000
"""

使用ix索引器处理可以达到混合的效果:

1
2
3
4
5
6
state.ix[:2, :'area']
"""
population area
湖南 1000 1A
广东 2000 2B
"""

ix对于整数的处理同Series中介绍的一样, 也容易发生混淆

在loc索引器中使用掩码和花哨索引:

1
2
3
4
5
6
state.loc[state.population > 1000, ['area', 'population']]
"""
area population
广东 2B 2000
上海 3C 10000
"""

其他取值方法

  • 如果对单个标签取值则选择列, 对多个标签切片则选择行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
print(state['area'])
"""
湖南 1A
广东 2B
上海 3C
Name: area, dtype: object
"""
print(state['湖南':'上海'])
"""
population area
湖南 1000 1A
广东 2000 2B
上海 10000 3C
"""
  • 掩码操作可以直接对每一行进行过滤而不需要loc索引器
1
2
3
4
5
6
state[state.population > 1000]  # == state.loc[state.population > 1000
"""
population area
广东 2000 2B
上海 10000 3C
"""

python数据科学(七) Pandas(二) 数据取值与选择
https://blog.roccoshi.top/posts/47646/
作者
RoccoShi
发布于
2021年1月20日
许可协议