DataFrame查询2 - 专用查询:索引和切片
Pandas专用查询方式
经过优化,推荐
三种查询方式:
- 索引
- 切片
- 过滤
索引和切片查询,两种查询方式:
- a.loc[行,列],标签索引,自定义索引
- a.iloc[行,列],位置索引,默认索引
参数书写顺序都是都是先行后列
import numpy as np
import pandas as pd
a_values = [
['小明','male',18,170.1,60,'北京海淀',61],
['小华','female',28,160,50,'上海静安',74],
['小红','female',22,175,64,'广州天河',59],
['小靑','male',31,182,80,'深圳南山',82],
['小兰','female',25,165,55,'杭州西湖',98],
]
a = pd.DataFrame(
a_values,
index=[1,2,3,4,5],
columns=['name','sex','age','heigh','weight','address','grade']
)
a

image.png
索引查询
用于不连续(行列有间隔)行列区块查询
查询单行
# 自定义索引查询
a.loc[3] # 简写
a.loc[3, :] # 完整写法
# 默认索引
a.iloc[2]
a.iloc[2, :]
name 小红
sex female
age 22
heigh 175
weight 64
address 广州天河
grade 59
Name: 3, dtype: object
type(a.loc[3]) # 查询结果为Series
pandas.core.series.Series
查询多行
a.loc[[2, 4]] # 选中所有列,省略了列条件
a.loc[[2, 4], :] # 完整写法
a.iloc[[1, 3]]

image.png
type(a.iloc[[1, 3]]) # 查询结果为DataFrame
pandas.core.frame.DataFrame
查询单列
a.loc[:, 'address']
a.iloc[:, 5]
1 北京海淀
2 上海静安
3 广州天河
4 深圳南山
5 杭州西湖
Name: address, dtype: object
查询多列
a.loc[:, ['name', 'address']]
a.iloc[:, [0, 5]]

image.png
查询一行多列
a.loc[2, ['name', 'address', 'grade']]
a.iloc[1, [0, 5, 6]]
name 小华
address 上海静安
grade 74
Name: 2, dtype: object
查询多行1列
a.loc[[1, 3, 5], 'address']
a.iloc[[0, 2, 4], 5]
1 北京海淀
3 广州天河
5 杭州西湖
Name: address, dtype: object
查询1行1列(单元格)
a.loc[3, 'name'] # 行列交叉处
a.iloc[2, 0]
# 针对单元格的特殊写法,效率更高
a.at[3, 'name'] # 自定义索引
a.iat[2, 0] # 默认索引
'小红'
查询多行多列交叉(多个单元格)
a.loc[[2, 4], ['name', 'address']]
a.iloc[[1, 3], [0, 5]]

image.png
切片查询
用于查询连续的行列区块
a

image.png
查询单行单列
a.loc[3, :]
a.loc[:, 'name']
1 小明
2 小华
3 小红
4 小靑
5 小兰
Name: name, dtype: object
查询多行多列(连续)
# 索引查询
a.loc[[2, 3, 4], ['age', 'heigh', 'weight']]

image.png
# 切片查询
a.loc[2:4, 'age':'weight'] # 自定义索引,切片范围包含起始值和结束值(特例)
a.iloc[1:4, 2:5] # 默认索引,切片范围,包含起始值,不包含结束值

image.png
切片步长和倒查
a.loc[::2, ::-1]

image.png
索引查询和切片查询的区别
- 索引查询更适合查询不连续的行列数据
- 切片查询适合查询连续行和列数据
索引查询可以实现切片查询的所有功能,只是有个书写效率问题
- 用索引查询查连续数据,需要将每个索引都写上,效率低
- 切片查询连续数据,只要写起始和结束索引即可。
- 切片不能查询不连续数据