查询数据
pandas查询数据的几种方法
- df.loc方法,根据行、列的标签值查询
- df.iloc方法,根据行、列的数字位置查询
- df.where方法
- df.query方法
.loc既能查询,又能覆盖写入,强烈推荐
pandas使用df.loc查询数据的方法
- 使用单个label值查询
- 使用值列表批量查询
- 使用数值区间进行范围查询
- 使用条件表达式查询
- 调用函数查询
注意:
以上查询方法,即适用于行,也适用于列
注意观察降维datafram>series>值
import pandas as pd
df=pd.read_excel("./weater_beijing.xlsx")
df.head()
| 日期 | 最高温 | 最低温 | 天气 | 风力风向 | 空气质量指数 | |
|---|---|---|---|---|---|---|
| 0 | 2011-01-01 周六 | -2° | -7° | 多云~阴 | 无持续风向微风 | NaN |
| 1 | 2011-01-02 周日 | -2° | -7° | 多云 | 无持续风向微风 | NaN |
| 2 | 2011-01-03 周一 | -2° | -6° | 多云~阴 | 西北风北风3-4级4-5级 | NaN |
| 3 | 2011-01-04 周二 | -2° | -9° | 晴 | 北风5-6级 | NaN |
| 4 | 2011-01-05 周三 | -2° | -10° | 晴 | 北风无持续风向3-4级微风 | NaN |
df.head()
| 日期 | 最高温 | 最低温 | 天气 | 风力风向 | 空气质量指数 | |
|---|---|---|---|---|---|---|
| 0 | 2011-01-01 周六 | -2° | -7° | 多云~阴 | 无持续风向微风 | NaN |
| 1 | 2011-01-02 周日 | -2° | -7° | 多云 | 无持续风向微风 | NaN |
| 2 | 2011-01-03 周一 | -2° | -6° | 多云~阴 | 西北风北风3-4级4-5级 | NaN |
| 3 | 2011-01-04 周二 | -2° | -9° | 晴 | 北风5-6级 | NaN |
| 4 | 2011-01-05 周三 | -2° | -10° | 晴 | 北风无持续风向3-4级微风 | NaN |
df.loc[:,'weekday']=df['日期'].str[-2:]
df.loc[:,'date']=df['日期'].str[:-2]
df.pop('日期')
0 2011-01-01 周六
1 2011-01-02 周日
2 2011-01-03 周一
3 2011-01-04 周二
4 2011-01-05 周三
...
4001 2021-12-27 周一
4002 2021-12-28 周二
4003 2021-12-29 周三
4004 2021-12-30 周四
4005 2021-12-31 周五
Name: 日期, Length: 4006, dtype: object
设定索引为日期 方便按日期筛选
df.set_index('date',inplace=True)
本次时间序列化按字符串处理
df.index
Index(['2011-01-01 ', '2011-01-02 ', '2011-01-03 ', '2011-01-04 ',
'2011-01-05 ', '2011-01-06 ', '2011-01-07 ', '2011-01-08 ',
'2011-01-09 ', '2011-01-10 ',
...
'2021-12-22 ', '2021-12-23 ', '2021-12-24 ', '2021-12-25 ',
'2021-12-26 ', '2021-12-27 ', '2021-12-28 ', '2021-12-29 ',
'2021-12-30 ', '2021-12-31 '],
dtype='object', name='date', length=4006)
替换温度的后缀°
df.loc[:,'最低温']=df['最低温'].str.replace("°","")
df.loc[:,'最高温']=df['最高温'].str.replace("°","")
将最低温中''替换成0
df.loc[:,'最低温']=df['最低温'].replace('','0')
将最高温和最低温列的obj类型转换成int型
df.loc[:,'最低温']=df.loc[:,'最低温'].astype('int32')
df.loc[:,'最高温']=df.loc[:,'最高温'].astype('int32')
C:\Users\JDQ\AppData\Local\Temp\ipykernel_8780\1612433086.py:2: DeprecationWarning: In a future version, df.iloc[:, i] = newvals will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either df[df.columns[i]] = newvals or, if columns are non-unique, df.isetitem(i, newvals)
df.loc[:,'最低温']=df.loc[:,'最低温'].astype('int32')
C:\Users\JDQ\AppData\Local\Temp\ipykernel_8780\1612433086.py:3: DeprecationWarning: In a future version, df.iloc[:, i] = newvals will attempt to set the values inplace instead of always setting a new array. To retain the old behavior, use either df[df.columns[i]] = newvals or, if columns are non-unique, df.isetitem(i, newvals)
df.loc[:,'最高温']=df.loc[:,'最高温'].astype('int32')
df.dtypes
最高温 int32
最低温 int32
天气 object
风力风向 object
空气质量指数 object
weekday object
dtype: object
df.head()
| 最高温 | 最低温 | 天气 | 风力风向 | 空气质量指数 | weekday | |
|---|---|---|---|---|---|---|
| date | ||||||
| 2011-01-01 | -2 | -7 | 多云~阴 | 无持续风向微风 | NaN | 周六 |
| 2011-01-02 | -2 | -7 | 多云 | 无持续风向微风 | NaN | 周日 |
| 2011-01-03 | -2 | -6 | 多云~阴 | 西北风北风3-4级4-5级 | NaN | 周一 |
| 2011-01-04 | -2 | -9 | 晴 | 北风5-6级 | NaN | 周二 |
| 2011-01-05 | -2 | -10 | 晴 | 北风无持续风向3-4级微风 | NaN | 周三 |
-
使用单个label值查询数据
行或者列,都可以只传入单个值,实现精确匹配得到单个值
这里发现经过处理的日期后面带有一个空格
df.loc['2011-01-09 ','天气']
'晴'
得到一个series
df.loc['2011-10-25 ',['最高温','最低温']]
最高温 16
最低温 5
Name: 2011-10-25 , dtype: object -
使用值列表批量查询
得到series
df.loc[['2018-05-02 ','2018-06-02 ','2018-07-02 '],['天气']]
| 天气 | |
|---|---|
| date | |
| 2018-05-02 | 多云~晴 |
| 2018-06-02 | 多云 |
| 2018-07-02 | 多云~雷阵雨 |
得到dataframe
df.loc[['2018-05-02 ','2018-06-02 ','2018-07-02 '],['天气','最高温','weekday']]
| 天气 | 最高温 | weekday | |
|---|---|---|---|
| date | |||
| 2018-05-02 | 多云~晴 | 25 | 周三 |
| 2018-06-02 | 多云 | 35 | 周六 |
| 2018-07-02 | 多云~雷阵雨 | 32 | 周一 |
-
使用数值区间进行范围查询
注意:区间既包括开始,也包括结束行index按区间
df.loc['2018-05-02 ':'2018-05-08 ','天气']
date
2018-05-02 多云~晴
2018-05-03 晴
2018-05-04 晴~多云
2018-05-05 多云
2018-05-06 晴
2018-05-07 晴
2018-05-08 晴
Name: 天气, dtype: object列index按区间
df.loc['2018-05-06 ','最高温':'风力风向']
最高温 28
最低温 14
天气 晴
风力风向 西南风1-2级
Name: 2018-05-06 , dtype: object行和列都按区间查询
df.loc['2018-05-02 ':'2018-05-08 ','最高温':'风力风向']
| 最高温 | 最低温 | 天气 | 风力风向 | |
|---|---|---|---|---|
| date | ||||
| 2018-05-02 | 25 | 13 | 多云~晴 | 北风3-4级 |
| 2018-05-03 | 24 | 12 | 晴 | 北风1-2级 |
| 2018-05-04 | 27 | 16 | 晴~多云 | 西南风1-2级 |
| 2018-05-05 | 25 | 13 | 多云 | 北风3-4级 |
| 2018-05-06 | 28 | 14 | 晴 | 西南风1-2级 |
| 2018-05-07 | 28 | 13 | 晴 | 南风3-4级 |
| 2018-05-08 | 27 | 13 | 晴 | 东南风3-4级 |
-
使用条件表达式查询
bool列表的长度等于航宇或者列数df.loc[df['最高温']>37,:]
| 最高温 | 最低温 | 天气 | 风力风向 | 空气质量指数 | weekday | |
|---|---|---|---|---|---|---|
| date | ||||||
| 2012-06-17 | 38 | 24 | 多云~晴 | 无持续风向微风 | NaN | 周日 |
| 2014-05-29 | 38 | 23 | 晴间多云~多云转晴 | 无持续风向微风 | NaN | 周四 |
| 2015-07-12 | 38 | 25 | 晴 | 无持续风向微风 | NaN | 周日 |
| 2015-07-13 | 40 | 25 | 雷雨~晴 | 无持续风向微风 | NaN | 周一 |
| 2017-06-15 | 38 | 24 | 晴 | 南风1-2级 | 82 良 | 周四 |
| 2018-06-05 | 38 | 25 | 多云 | 西南风4-5级 | 94 良 | 周二 |
| 2019-07-04 | 38 | 25 | 晴~多云 | 西南风2级 | 89 良 | 周四 |
观察一下这里的boolean条件
df['最高温']>37
date
2011-01-01 False
2011-01-02 False
2011-01-03 False
2011-01-04 False
2011-01-05 False
...
2021-12-27 False
2021-12-28 False
2021-12-29 False
2021-12-30 False
2021-12-31 False
Name: 最高温, Length: 4006, dtype: bool
复杂条件查询,查一下我心中的完美天气
注意:组合条件用&符号合并,每个条件判断都得带括号
查询最高温度小于30度,并且最低温度大于15度,并且是晴天、周二的数据
df.loc[(df['最高温']<30)&(df['最低温']>15)&(df['天气']'晴')&(df['weekday']'周二')]
| 最高温 | 最低温 | 天气 | 风力风向 | 空气质量指数 | weekday | |
|---|---|---|---|---|---|---|
| date | ||||||
| 2012-08-21 | 29 | 17 | 晴 | 北风3-4级 | NaN | 周二 |
| 2014-09-09 | 29 | 16 | 晴 | 无持续风向微风 | NaN | 周二 |
| 2015-05-19 | 28 | 17 | 晴 | 北风无持续风向4-5级微风 | NaN | 周二 |
| 2017-08-29 | 25 | 16 | 晴 | 西南风1-2级 | 42 优 | 周二 |
| 2020-04-28 | 27 | 16 | 晴 | 西南风2级 | 102 轻度 | 周二 |
| 2021-09-07 | 27 | 17 | 晴 | 西南风2级 | 32 优 | 周二 |
再次观察这里的boolean条件
(df['最高温']<30)&(df['最低温']>15)&(df['天气']'晴')&(df['weekday']'周二')
date
2011-01-01 False
2011-01-02 False
2011-01-03 False
2011-01-04 False
2011-01-05 False
...
2021-12-27 False
2021-12-28 False
2021-12-29 False
2021-12-30 False
2021-12-31 False
Length: 4006, dtype: bool
-
调用函数查询
直接写lambda表达式
df.loc[lambda df :(df['最高温']<30)&(df['最低温']>15)&(df['天气']'晴')&(df['weekday']'周二')]
| 最高温 | 最低温 | 天气 | 风力风向 | 空气质量指数 | weekday | |
|---|---|---|---|---|---|---|
| date | ||||||
| 2012-08-21 | 29 | 17 | 晴 | 北风3-4级 | NaN | 周二 |
| 2014-09-09 | 29 | 16 | 晴 | 无持续风向微风 | NaN | 周二 |
| 2015-05-19 | 28 | 17 | 晴 | 北风无持续风向4-5级微风 | NaN | 周二 |
| 2017-08-29 | 25 | 16 | 晴 | 西南风1-2级 | 42 优 | 周二 |
| 2020-04-28 | 27 | 16 | 晴 | 西南风2级 | 102 轻度 | 周二 |
| 2021-09-07 | 27 | 17 | 晴 | 西南风2级 | 32 优 | 周二 |
编写自己的函数,查询9月份,天气为晴的数据
def get_sep(df):
return df.index.str.startswith('2019-09') & (df['天气']=='晴')
df.loc[get_sep]
| 最高温 | 最低温 | 天气 | 风力风向 | 空气质量指数 | weekday | |
|---|---|---|---|---|---|---|
| date | ||||||
| 2019-09-02 | 34 | 20 | 晴 | 南风2级 | 67 良 | 周一 |
| 2019-09-03 | 33 | 20 | 晴 | 东南风2级 | 88 良 | 周二 |
| 2019-09-04 | 32 | 19 | 晴 | 东南风2级 | 91 良 | 周三 |
| 2019-09-05 | 33 | 20 | 晴 | 东南风2级 | 82 良 | 周四 |
| 2019-09-06 | 33 | 20 | 晴 | 东南风1级 | 86 良 | 周五 |
| 2019-09-07 | 34 | 21 | 晴 | 西南风2级 | 90 良 | 周六 |
| 2019-09-22 | 27 | 16 | 晴 | 东南风1级 | 116 轻度 | 周日 |
| 2019-09-23 | 30 | 17 | 晴 | 西北风2级 | 58 良 | 周一 |
| 2019-09-24 | 31 | 15 | 晴 | 东北风2级 | 38 优 | 周二 |
| 2019-09-25 | 31 | 16 | 晴 | 西南风2级 | 54 良 | 周三 |
| 2019-09-26 | 30 | 15 | 晴 | 东南风1级 | 64 良 | 周四 |
| 2019-09-27 | 29 | 15 | 晴 | 东南风2级 | 79 良 | 周五 |
| 2019-09-28 | 30 | 17 | 晴 | 西南风1级 | 84 良 | 周六 |
df.head()
| 最高温 | 最低温 | 天气 | 风力风向 | 空气质量指数 | weekday | |
|---|---|---|---|---|---|---|
| date | ||||||
| 2011-01-01 | -2 | -7 | 多云~阴 | 无持续风向微风 | NaN | 周六 |
| 2011-01-02 | -2 | -7 | 多云 | 无持续风向微风 | NaN | 周日 |
| 2011-01-03 | -2 | -6 | 多云~阴 | 西北风北风3-4级4-5级 | NaN | 周一 |
| 2011-01-04 | -2 | -9 | 晴 | 北风5-6级 | NaN | 周二 |
| 2011-01-05 | -2 | -10 | 晴 | 北风无持续风向3-4级微风 | NaN | 周三 |
df.to_excel('weather.xlsx',index=False)
浙公网安备 33010602011771号