学习目标
掌握获取df一列或多列数据的方法
知道loc和iloc的区别以及使用方法
知道df的query函数的使用方法
知道isin函数的作用和使用方法
获取DataFrame子集的基本方法
1.1 从前从后获取多行数据
案例中用到的数据集在文章顶部 LJdata.csv
前景回顾
head()
&tail()
import pandas as pd
# 加载csv数据集
df = pd.read_csv('LJdata.csv')
# 默认取前5行数据, 返回新的DataFrame
print(df.head())
# 取前10行数据
print(df.head(n=10))
# 默认取后5行数据, 返回新的DataFrame
print(df.tail())
# 取后10行数据
print(df.tail(n=10))
1.2 获取一列或多列数据
1.2.1 获取一列数据
获取一列数据, 通过
df[列名]
或df.列名
, 返回series对象==注意:==如果列名字中间有空格, 只能通过df['列名']方式获取
print(df['户型'])
print(df.户型)
print(type(df['户型'])) # <class 'pandas.core.series.Series'>
1.2.2 获取多列数据
获取多列数据, 通过
df[[列名1, 列名2, ...]]
, 返回dataframe对象==注意:==是两层[], 可以理解为df[列名的列表]
new_df = df[['区域', '地址']]
print(new_df)
print(type(new_df)) # <class 'pandas.core.frame.DataFrame'>
1.3 布尔值向量获取行数据
布尔值向量:完全由布尔值组成的一维数据,布尔值向量形式为
布尔值构成的列表
布尔值构成的series
布尔值构成的numpy.ndarray
df[[布尔值向量]]
其中布尔值向量
的布尔值个数必须和df的行数(df.shape[0]
)相等
1.3.1 布尔值列表获取对应为True的行数据
df_head = df.head()
print(df_head)
print(df_head[[False, True, False, False, True]])
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30区域 地址 户型 面积 价格 朝向 更新时间 看房人数
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30
1.3.2 布尔值构成的Series获取对应为True的行数据
print(df_head['面积'] > 80) # 返回布尔值构成的series对象
print(df_head[temp_df['面积'] > 80])
# 输出结果如下
0 False
1 False
2 True
3 True
4 False
Name: 面积, dtype: bool区域 地址 户型 面积 价格 朝向 更新时间 看房人数
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
1.3.3 布尔值构成的ndarray获取对应为True的行数据
import numpy as np
n1 = np.array([False, True, False, False, True])
print(n1)
print(df_head[n1])
# 输出结果如下
[False True False False True]区域 地址 户型 面积 价格 朝向 更新时间 看房人数
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30
1.4 索引下标切片获取行数据
通过
df[起始行下标:结束行下标:步长]
, 获取多行数据遵循==左闭右开==原则(包含起始行, 不包含结束行), 步长默认为1
temp_df = df.head(10) # 取原df前10行数据作为df4,默认自增索引由0到9
print(temp_df[0:3]) # 取前3行
print(temp_df[:5:2]) # 取前5行,步长为2
print(temp_df[1::3]) # 取第2行到最后所有行,步长为3
print(temp_df[-3:]) # 获取最后三行
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30区域 地址 户型 面积 价格 朝向 更新时间 看房人数
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30
7 马甸租房 月季园 2室1厅 53 6000 南 2017.07.16 26
loc通过行列名获取子集
df.loc[]
通过行名(行索引值、行索引名)、列名获取子集
2.1 行索引值获取1行数据
通过
df.loc[行索引值]
获取一行数据
# 获取行索引值为2的一行数据, 返回series
print(temp_df.loc[2])
# 输出结果如下
区域 广安门租房
地址 远见名苑
户型 2室1厅
面积 86
价格 8000
朝向 东
更新时间 2017.07.20
看房人数 34
Name: 2, dtype: object
2.2 行索引值获取多行数据
通过
df.loc[[行索引值1, 行索引值2, ...]]
获取多行数据
# 获取行索引值为0和2的两行数据, 返回dataframe
print(temp_df.loc[[0, 2]])
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
2.3 行索引值切片获取多行数据
通过
df.loc[起始行索引值:结束行索引值:步长]
获取多行数据遵循==左闭右闭==原则(包含起始行, 包含结束行), 步长默认为1
==注意:==
df.loc[起始行索引值:结束行索引值:步长]
不等同于df[起始行下标:结束行下标:步长]
print(temp_df.loc[:3]) # 表示获取行索引值0到3的行数据
print(temp_df[:3]) # 表示获取行下标值0到2的行数据
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
2.4 布尔值向量获取行数据
通过
df.loc[[布尔值向量]]
获取对应为True的行数据, 等同于df[[布尔值向量]]
df_head = df.head()
n1 = np.array([False, True, False, False, True])
print(df_head.loc[n1])
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30
2.5 布尔值向量取行再配合列名取子集
通过
df.loc[布尔值向量, [列名1, 列名2, ...]]
获取子集
# print(temp_df['区域'] == '望京租房') # 返回布尔值的series
# loc 有两个参数,参数1是布尔条件,参数2是选择查询的列
print(temp_df.loc[temp_df['区域'] == '望京租房', ['区域', '价格']])
# 输出结果如下区域 价格
1 望京租房 7800
2.6 行索引值取行再配合列名取子集
通过
df.loc[[行索引值1, 行索引值2, ...], [列名1, 列名2, ...]]
print(temp_df.loc[[1], ['区域', '价格']])
# 输出结果如下区域 价格
1 望京租房 7800
print(df.loc[4,'地址']) # 得到的是字符串
# 输出结果如下团结湖北口
2.7 行索引值切片取行再配合列名取子集
通过
df.loc[行索引值起始值:行索引值结束值:步长, [列名1, 列名2, ...]]
获取子集遵循==左闭右闭==原则(包含起始行, 包含结束行), 步长默认为1
print(temp_df.loc[1:5:2, ['区域', '价格']])
print(temp_df.loc[:, ['区域', '价格']])
# 输出结果如下区域 价格
1 望京租房 7800
3 天通苑租房 5300
5 回龙观租房 4000区域 价格
0 燕莎租房 5800
1 望京租房 7800
2 广安门租房 8000
3 天通苑租房 5300
4 团结湖租房 6400
5 回龙观租房 4000
6 北苑租房 7500
7 马甸租房 6000
8 小西天租房 8500
9 北苑租房 5300
3 iloc通过行列下标获取子集
df.iloc[]
通过行下标(行索引下标、行序号)、列下标获取子集
3.1 行下标获取1行数据
通过
df.iloc[行下标]
获取一行数据
# 获取行索引下标为2的一行数据, 返回series
dict_data= {'歌手':['周杰伦','张国荣','罗大佑'],'歌曲':['七里香','沉默是金','童年']
}
df_star = pd.DataFrame(data=dict_data,index=[2004,1991,1982],columns=['歌手','歌曲'])
print(df_star)
print(df_star.iloc[0]) # 行索引是: 2004 1991 1982 # 行下标是 : 0 1 2
# 输出结果
歌手 周杰伦
歌曲 七里香
Name: 2004, dtype: object
3.2 行下标获取多行数据
通过
df.iloc[[行下标1, 行下标2, ...]]
获取多行数据
# 获取行索引下标为0和2的两行数据, 返回dataframe
print(df_star.iloc[[0, 2]])
# 输出结果如下歌手 歌曲
2004 周杰伦 七里香
1982 罗大佑 童年
3.3 行下标切片获取多行数据
通过
df.iloc[起始行下标:结束行下标:步长]
获取多行数据遵循==左闭右开==原则(包含起始行, 不包含结束行), 步长默认为1
==注意:==
df.iloc[起始行下标:结束行下标:步长]
等同于df[起始行下标:结束行下标:步长]
print(temp_df.iloc[:3]) # 表示获取行下标为0到2的行数据
print(temp_df[:3]) # 表示获取行下标为0到2的行数据
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3.4 行列下标切片取子集
通过
df.iloc[起始行下标:结束行下标:步长, 起始列下标:结束列下标:步长]
获取子集遵循==左闭右开==原则(包含起始行/列, 不包含结束行/列), 步长默认为1
# 第1行到第5行,每2行选第1行;所有列,每2列取第1列
print(temp_df.iloc[0:5:2, ::2])
# 输出结果如下区域 户型 价格 更新时间
0 燕莎租房 2室1厅 5800 2017.07.21
2 广安门租房 2室1厅 8000 2017.07.20
4 团结湖租房 2室1厅 6400 2017.07.26
3.5 行下标切片和列下标取子集
通过
df.iloc[起始行下标:结束行下标:步长, [列下标1, 列下标2, ...]]
获取子集遵循==左闭右开==原则(包含起始行, 不包含结束行), 步长默认为1
# 第1行到第5行,每2行选第1行;第1列和第3列
print(temp_df.iloc[0:5:2, [0, 2]])
# 输出结果如下区域 户型
0 燕莎租房 2室1厅
2 广安门租房 2室1厅
4 团结湖租房 2室1厅
3.6 行下标和列下标取子集
通过
df.iloc[[行下标1, 行下标2, ...], [列下标1, 列下标2, ...]]
# 第1行、第3行、第5行;第1列和第3列
print(temp_df.iloc[[0, 2, 4], [0, 2]])
# 输出结果如下区域 户型
0 燕莎租房 2室1厅
2 广安门租房 2室1厅
4 团结湖租房 2室1厅
3.7 行下标和列下标切片取子集
通过
df.iloc[[行下标1, 行下标2, ...], 起始列下标:结束列下标:步长]
获取子集遵循==左闭右开==原则(包含起始列, 不包含结束列), 步长默认为1
# 第1行、第3行、第5行;所有列,每2列取第1列
print(temp_df.iloc[[0, 2, 4], ::2])
# 输出结果如下区域 户型 价格 更新时间
0 燕莎租房 2室1厅 5800 2017.07.21
2 广安门租房 2室1厅 8000 2017.07.20
4 团结湖租房 2室1厅 6400 2017.07.26
4 query函数获取子集
通过
df.query(判断表达式)
获取符合条件的df子集, 与df[[布尔值向量]]
效果相同==注意:==判断表达式为字符串格式
-
示例
print(temp_df.query("区域=='望京租房'")) # 区域是列名 ,望京租房是值 print(temp_df[temp_df['区域'] == '望京租房']) # 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数 1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
-
查询租房区域为望京、天通苑、回龙观并且朝向为东、南的房源数据
# .query().query()是链式编程, 第一个query查询之后,第二个query会在第一个的基础上再进行查询 print(temp_df.query('区域 in ["望京租房", "天通苑租房", "回龙观租房"]').query('朝向 in ["东", "南"]')) print(temp_df.query('(区域 in ["望京租房", "天通苑租房", "回龙观租房"]) and (朝向 in ["东", "南"])')) # 作用同上 print(temp_df.query('(区域 in ["望京租房", "天通苑租房", "回龙观租房"]) & (朝向 in ["东", "南"])')) # 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数 1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33 5 回龙观租房 龙华园 1室1厅 58 4000 南 2017.07.23 61
5 isin函数获取子集
通过
df.isin(values=[值1, 值2, ...])
判断df中的数据值是否在values列表值中, 返回由布尔值构成的新df原df中数据值在values列表中返回True, 否则返回False
temp_df = df.head(5)
# 拿到temp_df每行每列的值去和'天通苑租房'比较,如果比较成功,返回True,否则false
print(temp_df.isin(values=['天通苑租房']))
# 拿到temp_df每行每列的值去和'天通苑租房'或者'南'比较,如果比较成功,返回True,否则false
print(temp_df.isin(values=['天通苑租房', '南']))
print(temp_df[temp_df.isin(values=['天通苑租房', '南'])])
print(temp_df[((temp_df["区域"]=='望京租房') | (temp_df['区域']=='天通苑租房') | (temp_df['区域']=='回龙观租房')) & ((temp_df['朝向']=='东') | (temp_df['朝向']=='南'))])
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 False False False False False False False False
1 False False False False False False False False
2 False False False False False False False False
3 True False False False False False False False
4 False False False False False False False False区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 False False False False False True False False
1 False False False False False False False False
2 False False False False False False False False
3 True False False False False False False False
4 False False False False False True False False区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 NaN NaN NaN NaN NaN 南 NaN NaN
1 NaN NaN NaN NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN NaN NaN NaN
3 天通苑租房 NaN NaN NaN NaN NaN NaN NaN
4 NaN NaN NaN NaN NaN 南 NaN NaN
Serires对象使用isin函数返回新的s对象,其他完全相同
print(temp_df['区域'].isin(values=['天通苑租房']))
print(temp_df['区域'].isin(values=['天通苑租房', '回龙观租房']))
print(temp_df[temp_df['区域'].isin(values=['天通苑租房', '回龙观租房'])])
# 输出结果如下
0 False
1 False
2 False
3 True
4 False
Name: 区域, dtype: bool
0 False
1 False
2 False
3 True
4 False
Name: 区域, dtype: bool区域 地址 户型 面积 价格 朝向 更新时间 看房人数
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
总结
请对下列API 有印象、能找到、能理解、能看懂
-
API清单
子集操作方法 | 方法说明 |
---|---|
df.head(n) | 获取前n行数据,默认5行 |
df.tail(n) | 获取最后n行数据,默认5行 |
df[列名] 或 df.列名 | 获取一列数据 |
df[[列名1,列名2,...]] | 获取多列数据 |
df[[布尔值向量]] | df[[True, False, ...]]取出对应为True的数据行 |
df[起始行下标:结束行下标:步长] | 行下标(索引下标)切片获取数据行 |
df.loc[行索引值] | 索引值(行名)获取1行数据 |
df.loc[[行索引值1, 行索引值2, ...]] | 索引值(行名)获取多行数据 |
df.loc[起始行索引值:结束行索引值:步长] | 索引值(行名)切片获取多行数据,注意与df[起始行下标:结束行下标:步长]不同 |
df.loc[[布尔值向量]] | 布尔值向量获取行数据,等同于df[[布尔值向量]] |
df.loc[布尔值向量,[列名1, 列名2, ...]] | 布尔值向量取行再配合列名取子集 |
df.loc[[行索引值1, 行索引值2, ...], [列名1, 列名2, ...]] | 索引值取行再配合列名取子集 |
df.loc[行索引值起始值:行索引值结束值:步长, [列名1, 列名2, ...]] | 列名取子集 |
df.iloc[行下标] | 行下标取1行 |
df.iloc[[行下标1, 行下标2, ...]] | 行下标取多行 |
df.iloc[起始行下标:结束行下标:步长] | 行下标切片取多行 |
df.iloc[起始行下标:结束行下标:步长,起始列下标:结束列下标:步长] | 行列下标切片取子集 |
df.iloc[起始行下标:结束行下标:步长,[列下标1, 列下标2, ...]] | 行下标切片和列下标取子集 |
df.iloc[[行下标1, 行下标2, ...], [列下标1, 列下标2, ...]] | 行下标和列下标取子集 |
df.iloc[[行下标1, 行下标2, ...], 起始列下标:结束列下标:步长] | 行下标和列下标切片取子集 |
df.query('判断表达式字符串') 与 df[[布尔值向量]] 效果相同 | 依据判断表达式返回符合条件的df子集 |
df.isin([值1, 值2, ...]) | 判断是否存在某个值 |
-
loc和iloc的区别:
-
loc是根据行列名获取子集,行列名是肉眼看到的值
-
iloc是根据行列下标获取子集,行列下
-