目录
- 使用dataframe条件表达式查询
- 复杂条件查询
- 使用df.query可以简化查询
方法对比:
使用df[(df[“a”] > 3) & (df[“b”]<5)]的方式;
使用df.query(“a>3 & b<5”)的方式;
df = pd.read_csv("beijing_tianqi_2018.csv")
df.head()
|
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 |
# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')
使用dataframe条件表达式查询
最低温度低于-10度的列表
df[df["yWendu"] < -10].head()
|
ymd |
bWendu |
yWendu |
tianqi |
fengxiang |
fengli |
aqi |
aqiInfo |
aqiLevel |
22 |
2018-01-23 |
-4 |
-12 |
晴 |
西北风 |
3-4级 |
31 |
优 |
1 |
23 |
2018-01-24 |
-4 |
-11 |
晴 |
西南风 |
1-2级 |
34 |
优 |
1 |
24 |
2018-01-25 |
-3 |
-11 |
多云 |
东北风 |
1-2级 |
27 |
优 |
1 |
359 |
2018-12-26 |
-2 |
-11 |
晴~多云 |
东北风 |
2级 |
26 |
优 |
1 |
360 |
2018-12-27 |
-5 |
-12 |
多云~晴 |
西北风 |
3级 |
48 |
优 |
1 |
复杂条件查询
注意,组合条件用&符号合并,每个条件判断都得带括号
## 查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
df[
(df["bWendu"]<=30)
& (df["yWendu"]>=15)
& (df["tianqi"]=='晴')
& (df["aqiLevel"]==1)]
|
ymd |
bWendu |
yWendu |
tianqi |
fengxiang |
fengli |
aqi |
aqiInfo |
aqiLevel |
235 |
2018-08-24 |
30 |
20 |
晴 |
北风 |
1-2级 |
40 |
优 |
1 |
249 |
2018-09-07 |
27 |
16 |
晴 |
西北风 |
3-4级 |
22 |
优 |
1 |
使用df.query可以简化查询
形式:DataFrame.query(expr, inplace=False, **kwargs)
其中expr为要返回boolean结果的字符串表达式
形如:
- df.query(‘a<100’)
- df.query(‘a < b & b < c’),或者df.query(’(a<b)&(b<c)’)
df.query可支持的表达式语法:
- 逻辑操作符: &, |, ~
- 比较操作符: <, <=, ==, !=, >=, >
- 单变量操作符: -
- 多变量操作符: +, -, *, /, %
df.query中可以使用@var的方式传入外部变量
df.query支持的语法来自NumExpr,地址:
https://numexpr.readthedocs.io/projects/NumExpr3/en/latest/index.html
查询最低温度低于-10度的列表
df.query("yWendu < 3").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 |
查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
## 查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
df.query("bWendu<=30 & yWendu>=15 & tianqi=='晴' & aqiLevel==1")
|
ymd |
bWendu |
yWendu |
tianqi |
fengxiang |
fengli |
aqi |
aqiInfo |
aqiLevel |
235 |
2018-08-24 |
30 |
20 |
晴 |
北风 |
1-2级 |
40 |
优 |
1 |
249 |
2018-09-07 |
27 |
16 |
晴 |
西北风 |
3-4级 |
22 |
优 |
1 |
查询温差大于15度的日子
df.query("bWendu-yWendu >= 15").head()
|
ymd |
bWendu |
yWendu |
tianqi |
fengxiang |
fengli |
aqi |
aqiInfo |
aqiLevel |
68 |
2018-03-10 |
14 |
-2 |
晴 |
东南风 |
1-2级 |
171 |
中度污染 |
4 |
82 |
2018-03-24 |
22 |
5 |
晴 |
西南风 |
1-2级 |
119 |
轻度污染 |
3 |
83 |
2018-03-25 |
24 |
7 |
晴 |
南风 |
1-2级 |
78 |
良 |
2 |
84 |
2018-03-26 |
25 |
7 |
多云 |
西南风 |
1-2级 |
151 |
中度污染 |
4 |
85 |
2018-03-27 |
27 |
11 |
晴 |
南风 |
1-2级 |
243 |
重度污染 |
5 |
可以使用外部的变量
# 查询温度在这两个温度之间的数据
high_temperature = 15
low_temperature = 13
df.query("yWendu<=@high_temperature & yWendu>=@low_temperature").head()
|
ymd |
bWendu |
yWendu |
tianqi |
fengxiang |
fengli |
aqi |
aqiInfo |
aqiLevel |
107 |
2018-04-18 |
27 |
14 |
多云~晴 |
西南风 |
3-4级 |
147 |
轻度污染 |
3 |
108 |
2018-04-19 |
26 |
13 |
多云 |
东南风 |
4-5级 |
170 |
中度污染 |
4 |
109 |
2018-04-20 |
28 |
14 |
多云~小雨 |
南风 |
4-5级 |
164 |
中度污染 |
4 |
116 |
2018-04-27 |
25 |
13 |
晴 |
西南风 |
3-4级 |
112 |
轻度污染 |
3 |
119 |
2018-04-30 |
24 |
14 |
多云 |
南风 |
3-4级 |
62 |
良 |
2 |