查询数据

pandas查询数据的几种方法

  1. df.loc方法,根据行、列的标签值查询
  2. df.iloc方法,根据行、列的数字位置查询
  3. df.where方法
  4. df.query方法
    .loc既能查询,又能覆盖写入,强烈推荐

pandas使用df.loc查询数据的方法

  1. 使用单个label值查询
  2. 使用值列表批量查询
  3. 使用数值区间进行范围查询
  4. 使用条件表达式查询
  5. 调用函数查询

注意:

以上查询方法,即适用于行,也适用于列

注意观察降维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 周三
  1. 使用单个label值查询数据
    行或者列,都可以只传入单个值,实现精确匹配

    得到单个值

    这里发现经过处理的日期后面带有一个空格

    df.loc['2011-01-09 ','天气']

    '晴'

    得到一个series

    df.loc['2011-10-25 ',['最高温','最低温']]

    最高温 16
    最低温 5
    Name: 2011-10-25 , dtype: object

  2. 使用值列表批量查询

    得到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 周一
  1. 使用数值区间进行范围查询
    注意:区间既包括开始,也包括结束

    行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级
  1. 使用条件表达式查询
    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

  1. 调用函数查询

    直接写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)

posted @ 2023-09-05 00:30  慆慢险躁  阅读(96)  评论(0)    收藏  举报