Pandas查询数据的几种方法
df.loc方法,根据行、列的标签值查询
df.iloc方法,根据行、列的数字位置查询
df.where方法
df.query方法
.loc既能查询,又能覆盖写入,强烈推荐!
本文介绍的是Pandas使用df.loc查询数据的方法
1.使用单个label值查询数据
2.使用值列表批量查询
3.使用数值区间进行范围查询
4.使用条件表达式查询
5.调用函数查询
注意
- 以上查询方法,既适用于行,也适用于列
- 注意观察降维dataFrame>Series>值
导入pandas库
import pandas as pd
print(pd.__version__)
0、读取数据
数据为北京2018年全年天气预报
该数据的爬虫教程参见Python爬虫系列视频课程
读取csv文件
df = pd.read_csv("./datas/beijing_tianqi/beijing_tianqi_2018.csv")
3
df.head()
3
ymd bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
0 2018-01-01 3℃ -6℃ 晴~多云 东北风 1-2级 59 良 2
1 2018-01-02 2℃ -5℃ 阴~多云 东北风 1-2级 49 优 1
2 2018-01-03 2℃ -5℃ 多云 北风 1-2级 28 优 1
3 2018-01-04 0℃ -8℃ 阴 东北风 1-2级 28 优 1
4 2018-01-05 3℃ -6℃ 多云~晴 西北风 1-2级 50 优 1
4
# 设定索引为日期,方便按日期筛选
df.set_index('ymd', inplace=True)
No output
5
# 时间序列见后续课程,本次按字符串处理
df.index
5
Index(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05',
'2018-01-06', '2018-01-07', '2018-01-08', '2018-01-09', '2018-01-10',
...
'2018-12-22', '2018-12-23', '2018-12-24', '2018-12-25', '2018-12-26',
'2018-12-27', '2018-12-28', '2018-12-29', '2018-12-30', '2018-12-31'],
dtype='object', name='ymd', length=365)
6
df.head()
6
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-01-01 3℃ -6℃ 晴~多云 东北风 1-2级 59 良 2
2018-01-02 2℃ -5℃ 阴~多云 东北风 1-2级 49 优 1
2018-01-03 2℃ -5℃ 多云 北风 1-2级 28 优 1
2018-01-04 0℃ -8℃ 阴 东北风 1-2级 28 优 1
2018-01-05 3℃ -6℃ 多云~晴 西北风 1-2级 50 优 1
7
# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
No output
8
df.dtypes
8
bWendu int32
yWendu int32
tianqi object
fengxiang object
fengli object``
aqi int64
aqiInfo object
aqiLevel int64
dtype: object
9
df.head()
9
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-01-01 3 -6 晴~多云 东北风 1-2级 59 良 2
2018-01-02 2 -5 阴~多云 东北风 1-2级 49 优 1
2018-01-03 2 -5 多云 北风 1-2级 28 优 1
2018-01-04 0 -8 阴 东北风 1-2级 28 优 1
2018-01-05 3 -6 多云~晴 西北风 1-2级 50 优 1
1、使用单个label值查询数据
行或者列,都可以只传入单个值,实现精确匹配
10
# 得到单个值
df.loc['2018-01-03', 'bWendu']
10
2
11
# 得到一个Series
df.loc['2018-01-03', ['bWendu', 'yWendu']]
11
bWendu 2
yWendu -5
Name: 2018-01-03, dtype: object
2、使用值列表批量查询
12
# 得到Series
df.loc[['2018-01-03','2018-01-04','2018-01-05'], 'bWendu']
12
ymd
2018-01-03 2
2018-01-04 0
2018-01-05 3
Name: bWendu, dtype: int32
13
# 得到DataFrame
df.loc[['2018-01-03','2018-01-04','2018-01-05'], ['bWendu', 'yWendu']]
13
bWendu yWendu
ymd
2018-01-03 2 -5
2018-01-04 0 -8
2018-01-05 3 -6
3、使用数值区间进行范围查询
注意:区间既包含开始,也包含结束
14
# 行index按区间
df.loc['2018-01-03':'2018-01-05', 'bWendu']
14
ymd
2018-01-03 2
2018-01-04 0
2018-01-05 3
Name: bWendu, dtype: int32
15
# 列index按区间
df.loc['2018-01-03', 'bWendu':'fengxiang']
15
bWendu 2
yWendu -5
tianqi 多云
fengxiang 北风
Name: 2018-01-03, dtype: object
16
# 行和列都按区间查询
df.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']
16
bWendu yWendu tianqi fengxiang
ymd
2018-01-03 2 -5 多云 北风
2018-01-04 0 -8 阴 东北风
2018-01-05 3 -6 多云~晴 西北风
4、使用条件表达式查询
bool列表的长度得等于行数或者列数
简单条件查询,最低温度低于-10度的列表
17
df.loc[df["yWendu"]<-10, :]
17
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-01-23 -4 -12 晴 西北风 3-4级 31 优 1
2018-01-24 -4 -11 晴 西南风 1-2级 34 优 1
2018-01-25 -3 -11 多云 东北风 1-2级 27 优 1
2018-12-26 -2 -11 晴~多云 东北风 2级 26 优 1
2018-12-27 -5 -12 多云~晴 西北风 3级 48 优 1
2018-12-28 -3 -11 晴 西北风 3级 40 优 1
2018-12-29 -3 -12 晴 西北风 2级 29 优 1
2018-12-30 -2 -11 晴~多云 东北风 1级 31 优 1
18
# 观察一下这里的boolean条件
df["yWendu"]<-10
18
ymd
2018-01-01 False
2018-01-02 False
2018-01-03 False
2018-01-04 False
2018-01-05 False
...
2018-12-27 True
2018-12-28 True
2018-12-29 True
2018-12-30 True
2018-12-31 False
Name: yWendu, Length: 365, dtype: bool
复杂条件查询,查一下我心中的完美天气
注意,组合条件用&符号合并,每个条件判断都得带括号
19
## 查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
df.loc[(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1), :]
19
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-08-24 30 20 晴 北风 1-2级 40 优 1
2018-09-07 27 16 晴 西北风 3-4级 22 优 1
我哭,北京好天气这么稀少!!
20
# 再次观察这里的boolean条件
(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1)
20
ymd
2018-01-01 False
2018-01-02 False
2018-01-03 False
2018-01-04 False
2018-01-05 False
...
2018-12-27 False
2018-12-28 False
2018-12-29 False
2018-12-30 False
2018-12-31 False
Length: 365, dtype: bool
5、调用函数查询
21
# 直接写lambda表达式
df.loc[lambda df : (df["bWendu"]<=30) & (df["yWendu"]>=15), :]
21
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-04-28 27 17 晴 西南风 3-4级 125 轻度污染 3
2018-04-29 30 16 多云 南风 3-4级 193 中度污染 4
2018-05-04 27 16 晴~多云 西南风 1-2级 86 良 2
2018-05-09 29 17 晴~多云 西南风 3-4级 79 良 2
2018-05-10 26 18 多云 南风 3-4级 118 轻度污染 3
... ... ... ... ... ... ... ... ...
2018-09-15 26 15 多云 北风 3-4级 42 优 1
2018-09-17 27 17 多云~阴 北风 1-2级 37 优 1
2018-09-18 25 17 阴~多云 西南风 1-2级 50 优 1
2018-09-19 26 17 多云 南风 1-2级 52 良 2
2018-09-20 27 16 多云 西南风 1-2级 63 良 2
64 rows × 8 columns
22
# 编写自己的函数,查询9月份,空气质量好的数据
def query_my_data(df):
return df.index.str.startswith("2018-09") & (df["aqiLevel"]==1)
df.loc[query_my_data, :]
22
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-09-01 27 19 阴~小雨 南风 1-2级 50 优 1
2018-09-04 31 18 晴 西南风 3-4级 24 优 1
2018-09-05 31 19 晴~多云 西南风 3-4级 34 优 1
2018-09-06 27 18 多云~晴 西北风 4-5级 37 优 1
2018-09-07 27 16 晴 西北风 3-4级 22 优 1
2018-09-08 27 15 多云~晴 北风 1-2级 28 优 1
2018-09-15 26 15 多云 北风 3-4级 42 优 1
2018-09-16 25 14 多云~晴 北风 1-2级 29 优 1
2018-09-17 27 17 多云~阴 北风 1-2级 37 优 1
2018-09-18 25 17 阴~多云 西南风 1-2级 50 优 1
2018-09-21 25 14 晴 西北风 3-4级 50 优 1
2018-09-22 24 13 晴 西北风 3-4级 28 优 1
2018-09-23 23 12 晴 西北风 4-5级 28 优 1
2018-09-24 23 11 晴 北风 1-2级 28 优 1
2018-09-25 24 12 晴~多云 南风 1-2级 44 优 1
2018-09-29 22 11 晴 北风 3-4级 21 优 1
2018-09-30 19 13 多云 西北风 4-5级 22 优 1