Pandas 四:查询数据

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-2592
1	2018-01-02	2-5℃	阴~多云	东北风	1-2491
2	2018-01-03	2-5℃	多云	北风	1-2281
3	2018-01-04	0-8℃	阴	东北风	1-2281
4	2018-01-05	3-6℃	多云~晴	西北风	1-2501

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-2592
2018-01-02	2-5℃	阴~多云	东北风	1-2491
2018-01-03	2-5℃	多云	北风	1-2281
2018-01-04	0-8℃	阴	东北风	1-2281
2018-01-05	3-6℃	多云~晴	西北风	1-2501

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-2592
2018-01-02	2	-5~多云	东北风	1-2491
2018-01-03	2	-5	多云	北风	1-2281
2018-01-04	0	-8	阴	东北风	1-2281
2018-01-05	3	-6	多云~晴	西北风	1-2501

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-4311
2018-01-24	-4	-11	晴	西南风	1-2341
2018-01-25	-3	-11	多云	东北风	1-2271
2018-12-26	-2	-11~多云	东北风	2261
2018-12-27	-5	-12	多云~晴	西北风	3481
2018-12-28	-3	-11	晴	西北风	3401
2018-12-29	-3	-12	晴	西北风	2291
2018-12-30	-2	-11~多云	东北风	1311

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-2401
2018-09-07	27	16	晴	西北风	3-4221
我哭,北京好天气这么稀少!!

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-4125	轻度污染	3
2018-04-29	30	16	多云	南风	3-4193	中度污染	4
2018-05-04	27	16~多云	西南风	1-2862
2018-05-09	29	17~多云	西南风	3-4792
2018-05-10	26	18	多云	南风	3-4118	轻度污染	3
...	...	...	...	...	...	...	...	...
2018-09-15	26	15	多云	北风	3-4421
2018-09-17	27	17	多云~阴	北风	1-2371
2018-09-18	25	17~多云	西南风	1-2501
2018-09-19	26	17	多云	南风	1-2522
2018-09-20	27	16	多云	西南风	1-2632
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-2501
2018-09-04	31	18	晴	西南风	3-4241
2018-09-05	31	19~多云	西南风	3-4341
2018-09-06	27	18	多云~晴	西北风	4-5371
2018-09-07	27	16	晴	西北风	3-4221
2018-09-08	27	15	多云~晴	北风	1-2281
2018-09-15	26	15	多云	北风	3-4421
2018-09-16	25	14	多云~晴	北风	1-2291
2018-09-17	27	17	多云~阴	北风	1-2371
2018-09-18	25	17~多云	西南风	1-2501
2018-09-21	25	14	晴	西北风	3-4501
2018-09-22	24	13	晴	西北风	3-4281
2018-09-23	23	12	晴	西北风	4-5281
2018-09-24	23	11	晴	北风	1-2281
2018-09-25	24	12~多云	南风	1-2441
2018-09-29	22	11	晴	北风	3-4211
2018-09-30	19	13	多云	西北风	4-5221
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值