查询数据

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()
<tr style="text-align: right;">
  <th></th>
  <th>日期</th>
  <th>最高温</th>
  <th>最低温</th>
  <th>天气</th>
  <th>风力风向</th>
  <th>空气质量指数</th>
</tr>
<tr>
  <th>0</th>
  <td>2011-01-01 周六</td>
  <td>-2°</td>
  <td>-7°</td>
  <td>多云~阴</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
</tr>
<tr>
  <th>1</th>
  <td>2011-01-02 周日</td>
  <td>-2°</td>
  <td>-7°</td>
  <td>多云</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
</tr>
<tr>
  <th>2</th>
  <td>2011-01-03 周一</td>
  <td>-2°</td>
  <td>-6°</td>
  <td>多云~阴</td>
  <td>西北风~北风3-4级~4-5级</td>
  <td>NaN</td>
</tr>
<tr>
  <th>3</th>
  <td>2011-01-04 周二</td>
  <td>-2°</td>
  <td>-9°</td>
  <td>晴</td>
  <td>北风5-6级</td>
  <td>NaN</td>
</tr>
<tr>
  <th>4</th>
  <td>2011-01-05 周三</td>
  <td>-2°</td>
  <td>-10°</td>
  <td>晴</td>
  <td>北风~无持续风向3-4级~微风</td>
  <td>NaN</td>
</tr>
df.head()
<tr style="text-align: right;">
  <th></th>
  <th>日期</th>
  <th>最高温</th>
  <th>最低温</th>
  <th>天气</th>
  <th>风力风向</th>
  <th>空气质量指数</th>
</tr>
<tr>
  <th>0</th>
  <td>2011-01-01 周六</td>
  <td>-2°</td>
  <td>-7°</td>
  <td>多云~阴</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
</tr>
<tr>
  <th>1</th>
  <td>2011-01-02 周日</td>
  <td>-2°</td>
  <td>-7°</td>
  <td>多云</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
</tr>
<tr>
  <th>2</th>
  <td>2011-01-03 周一</td>
  <td>-2°</td>
  <td>-6°</td>
  <td>多云~阴</td>
  <td>西北风~北风3-4级~4-5级</td>
  <td>NaN</td>
</tr>
<tr>
  <th>3</th>
  <td>2011-01-04 周二</td>
  <td>-2°</td>
  <td>-9°</td>
  <td>晴</td>
  <td>北风5-6级</td>
  <td>NaN</td>
</tr>
<tr>
  <th>4</th>
  <td>2011-01-05 周三</td>
  <td>-2°</td>
  <td>-10°</td>
  <td>晴</td>
  <td>北风~无持续风向3-4级~微风</td>
  <td>NaN</td>
</tr>
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()
<tr style="text-align: right;">
  <th></th>
  <th>最高温</th>
  <th>最低温</th>
  <th>天气</th>
  <th>风力风向</th>
  <th>空气质量指数</th>
  <th>weekday</th>
</tr>
<tr>
  <th>date</th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
</tr>
<tr>
  <th>2011-01-01</th>
  <td>-2</td>
  <td>-7</td>
  <td>多云~阴</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
  <td>周六</td>
</tr>
<tr>
  <th>2011-01-02</th>
  <td>-2</td>
  <td>-7</td>
  <td>多云</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
  <td>周日</td>
</tr>
<tr>
  <th>2011-01-03</th>
  <td>-2</td>
  <td>-6</td>
  <td>多云~阴</td>
  <td>西北风~北风3-4级~4-5级</td>
  <td>NaN</td>
  <td>周一</td>
</tr>
<tr>
  <th>2011-01-04</th>
  <td>-2</td>
  <td>-9</td>
  <td>晴</td>
  <td>北风5-6级</td>
  <td>NaN</td>
  <td>周二</td>
</tr>
<tr>
  <th>2011-01-05</th>
  <td>-2</td>
  <td>-10</td>
  <td>晴</td>
  <td>北风~无持续风向3-4级~微风</td>
  <td>NaN</td>
  <td>周三</td>
</tr>
  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 '],['天气']]

<tr style="text-align: right;">
  <th></th>
  <th>天气</th>
</tr>
<tr>
  <th>date</th>
  <th></th>
</tr>
<tr>
  <th>2018-05-02</th>
  <td>多云~晴</td>
</tr>
<tr>
  <th>2018-06-02</th>
  <td>多云</td>
</tr>
<tr>
  <th>2018-07-02</th>
  <td>多云~雷阵雨</td>
</tr>
# 得到dataframe
df.loc[['2018-05-02 ','2018-06-02 ','2018-07-02 '],['天气','最高温','weekday']]
<tr style="text-align: right;">
  <th></th>
  <th>天气</th>
  <th>最高温</th>
  <th>weekday</th>
</tr>
<tr>
  <th>date</th>
  <th></th>
  <th></th>
  <th></th>
</tr>
<tr>
  <th>2018-05-02</th>
  <td>多云~晴</td>
  <td>25</td>
  <td>周三</td>
</tr>
<tr>
  <th>2018-06-02</th>
  <td>多云</td>
  <td>35</td>
  <td>周六</td>
</tr>
<tr>
  <th>2018-07-02</th>
  <td>多云~雷阵雨</td>
  <td>32</td>
  <td>周一</td>
</tr>
  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 ','最高温':'风力风向']

<tr style="text-align: right;">
  <th></th>
  <th>最高温</th>
  <th>最低温</th>
  <th>天气</th>
  <th>风力风向</th>
</tr>
<tr>
  <th>date</th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
</tr>
<tr>
  <th>2018-05-02</th>
  <td>25</td>
  <td>13</td>
  <td>多云~晴</td>
  <td>北风3-4级</td>
</tr>
<tr>
  <th>2018-05-03</th>
  <td>24</td>
  <td>12</td>
  <td>晴</td>
  <td>北风1-2级</td>
</tr>
<tr>
  <th>2018-05-04</th>
  <td>27</td>
  <td>16</td>
  <td>晴~多云</td>
  <td>西南风1-2级</td>
</tr>
<tr>
  <th>2018-05-05</th>
  <td>25</td>
  <td>13</td>
  <td>多云</td>
  <td>北风3-4级</td>
</tr>
<tr>
  <th>2018-05-06</th>
  <td>28</td>
  <td>14</td>
  <td>晴</td>
  <td>西南风1-2级</td>
</tr>
<tr>
  <th>2018-05-07</th>
  <td>28</td>
  <td>13</td>
  <td>晴</td>
  <td>南风3-4级</td>
</tr>
<tr>
  <th>2018-05-08</th>
  <td>27</td>
  <td>13</td>
  <td>晴</td>
  <td>东南风3-4级</td>
</tr>
  1. 使用条件表达式查询
    bool列表的长度等于航宇或者列数

    df.loc[df['最高温']>37,:]

<tr style="text-align: right;">
  <th></th>
  <th>最高温</th>
  <th>最低温</th>
  <th>天气</th>
  <th>风力风向</th>
  <th>空气质量指数</th>
  <th>weekday</th>
</tr>
<tr>
  <th>date</th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
</tr>
<tr>
  <th>2012-06-17</th>
  <td>38</td>
  <td>24</td>
  <td>多云~晴</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
  <td>周日</td>
</tr>
<tr>
  <th>2014-05-29</th>
  <td>38</td>
  <td>23</td>
  <td>晴间多云~多云转晴</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
  <td>周四</td>
</tr>
<tr>
  <th>2015-07-12</th>
  <td>38</td>
  <td>25</td>
  <td>晴</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
  <td>周日</td>
</tr>
<tr>
  <th>2015-07-13</th>
  <td>40</td>
  <td>25</td>
  <td>雷雨~晴</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
  <td>周一</td>
</tr>
<tr>
  <th>2017-06-15</th>
  <td>38</td>
  <td>24</td>
  <td>晴</td>
  <td>南风1-2级</td>
  <td>82 良</td>
  <td>周四</td>
</tr>
<tr>
  <th>2018-06-05</th>
  <td>38</td>
  <td>25</td>
  <td>多云</td>
  <td>西南风4-5级</td>
  <td>94 良</td>
  <td>周二</td>
</tr>
<tr>
  <th>2019-07-04</th>
  <td>38</td>
  <td>25</td>
  <td>晴~多云</td>
  <td>西南风2级</td>
  <td>89 良</td>
  <td>周四</td>
</tr>
# 观察一下这里的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']=='周二')]
<tr style="text-align: right;">
  <th></th>
  <th>最高温</th>
  <th>最低温</th>
  <th>天气</th>
  <th>风力风向</th>
  <th>空气质量指数</th>
  <th>weekday</th>
</tr>
<tr>
  <th>date</th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
</tr>
<tr>
  <th>2012-08-21</th>
  <td>29</td>
  <td>17</td>
  <td>晴</td>
  <td>北风3-4级</td>
  <td>NaN</td>
  <td>周二</td>
</tr>
<tr>
  <th>2014-09-09</th>
  <td>29</td>
  <td>16</td>
  <td>晴</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
  <td>周二</td>
</tr>
<tr>
  <th>2015-05-19</th>
  <td>28</td>
  <td>17</td>
  <td>晴</td>
  <td>北风~无持续风向4-5级~微风</td>
  <td>NaN</td>
  <td>周二</td>
</tr>
<tr>
  <th>2017-08-29</th>
  <td>25</td>
  <td>16</td>
  <td>晴</td>
  <td>西南风1-2级</td>
  <td>42 优</td>
  <td>周二</td>
</tr>
<tr>
  <th>2020-04-28</th>
  <td>27</td>
  <td>16</td>
  <td>晴</td>
  <td>西南风2级</td>
  <td>102 轻度</td>
  <td>周二</td>
</tr>
<tr>
  <th>2021-09-07</th>
  <td>27</td>
  <td>17</td>
  <td>晴</td>
  <td>西南风2级</td>
  <td>32 优</td>
  <td>周二</td>
</tr>
# 再次观察这里的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']'周二')]

<tr style="text-align: right;">
  <th></th>
  <th>最高温</th>
  <th>最低温</th>
  <th>天气</th>
  <th>风力风向</th>
  <th>空气质量指数</th>
  <th>weekday</th>
</tr>
<tr>
  <th>date</th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
</tr>
<tr>
  <th>2012-08-21</th>
  <td>29</td>
  <td>17</td>
  <td>晴</td>
  <td>北风3-4级</td>
  <td>NaN</td>
  <td>周二</td>
</tr>
<tr>
  <th>2014-09-09</th>
  <td>29</td>
  <td>16</td>
  <td>晴</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
  <td>周二</td>
</tr>
<tr>
  <th>2015-05-19</th>
  <td>28</td>
  <td>17</td>
  <td>晴</td>
  <td>北风~无持续风向4-5级~微风</td>
  <td>NaN</td>
  <td>周二</td>
</tr>
<tr>
  <th>2017-08-29</th>
  <td>25</td>
  <td>16</td>
  <td>晴</td>
  <td>西南风1-2级</td>
  <td>42 优</td>
  <td>周二</td>
</tr>
<tr>
  <th>2020-04-28</th>
  <td>27</td>
  <td>16</td>
  <td>晴</td>
  <td>西南风2级</td>
  <td>102 轻度</td>
  <td>周二</td>
</tr>
<tr>
  <th>2021-09-07</th>
  <td>27</td>
  <td>17</td>
  <td>晴</td>
  <td>西南风2级</td>
  <td>32 优</td>
  <td>周二</td>
</tr>
# 编写自己的函数,查询9月份,天气为晴的数据
def get_sep(df):
    return df.index.str.startswith('2019-09') & (df['天气']=='晴')

df.loc[get_sep]
<tr style="text-align: right;">
  <th></th>
  <th>最高温</th>
  <th>最低温</th>
  <th>天气</th>
  <th>风力风向</th>
  <th>空气质量指数</th>
  <th>weekday</th>
</tr>
<tr>
  <th>date</th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
</tr>
<tr>
  <th>2019-09-02</th>
  <td>34</td>
  <td>20</td>
  <td>晴</td>
  <td>南风2级</td>
  <td>67 良</td>
  <td>周一</td>
</tr>
<tr>
  <th>2019-09-03</th>
  <td>33</td>
  <td>20</td>
  <td>晴</td>
  <td>东南风2级</td>
  <td>88 良</td>
  <td>周二</td>
</tr>
<tr>
  <th>2019-09-04</th>
  <td>32</td>
  <td>19</td>
  <td>晴</td>
  <td>东南风2级</td>
  <td>91 良</td>
  <td>周三</td>
</tr>
<tr>
  <th>2019-09-05</th>
  <td>33</td>
  <td>20</td>
  <td>晴</td>
  <td>东南风2级</td>
  <td>82 良</td>
  <td>周四</td>
</tr>
<tr>
  <th>2019-09-06</th>
  <td>33</td>
  <td>20</td>
  <td>晴</td>
  <td>东南风1级</td>
  <td>86 良</td>
  <td>周五</td>
</tr>
<tr>
  <th>2019-09-07</th>
  <td>34</td>
  <td>21</td>
  <td>晴</td>
  <td>西南风2级</td>
  <td>90 良</td>
  <td>周六</td>
</tr>
<tr>
  <th>2019-09-22</th>
  <td>27</td>
  <td>16</td>
  <td>晴</td>
  <td>东南风1级</td>
  <td>116 轻度</td>
  <td>周日</td>
</tr>
<tr>
  <th>2019-09-23</th>
  <td>30</td>
  <td>17</td>
  <td>晴</td>
  <td>西北风2级</td>
  <td>58 良</td>
  <td>周一</td>
</tr>
<tr>
  <th>2019-09-24</th>
  <td>31</td>
  <td>15</td>
  <td>晴</td>
  <td>东北风2级</td>
  <td>38 优</td>
  <td>周二</td>
</tr>
<tr>
  <th>2019-09-25</th>
  <td>31</td>
  <td>16</td>
  <td>晴</td>
  <td>西南风2级</td>
  <td>54 良</td>
  <td>周三</td>
</tr>
<tr>
  <th>2019-09-26</th>
  <td>30</td>
  <td>15</td>
  <td>晴</td>
  <td>东南风1级</td>
  <td>64 良</td>
  <td>周四</td>
</tr>
<tr>
  <th>2019-09-27</th>
  <td>29</td>
  <td>15</td>
  <td>晴</td>
  <td>东南风2级</td>
  <td>79 良</td>
  <td>周五</td>
</tr>
<tr>
  <th>2019-09-28</th>
  <td>30</td>
  <td>17</td>
  <td>晴</td>
  <td>西南风1级</td>
  <td>84 良</td>
  <td>周六</td>
</tr>
df.head()
<tr style="text-align: right;">
  <th></th>
  <th>最高温</th>
  <th>最低温</th>
  <th>天气</th>
  <th>风力风向</th>
  <th>空气质量指数</th>
  <th>weekday</th>
</tr>
<tr>
  <th>date</th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
  <th></th>
</tr>
<tr>
  <th>2011-01-01</th>
  <td>-2</td>
  <td>-7</td>
  <td>多云~阴</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
  <td>周六</td>
</tr>
<tr>
  <th>2011-01-02</th>
  <td>-2</td>
  <td>-7</td>
  <td>多云</td>
  <td>无持续风向微风</td>
  <td>NaN</td>
  <td>周日</td>
</tr>
<tr>
  <th>2011-01-03</th>
  <td>-2</td>
  <td>-6</td>
  <td>多云~阴</td>
  <td>西北风~北风3-4级~4-5级</td>
  <td>NaN</td>
  <td>周一</td>
</tr>
<tr>
  <th>2011-01-04</th>
  <td>-2</td>
  <td>-9</td>
  <td>晴</td>
  <td>北风5-6级</td>
  <td>NaN</td>
  <td>周二</td>
</tr>
<tr>
  <th>2011-01-05</th>
  <td>-2</td>
  <td>-10</td>
  <td>晴</td>
  <td>北风~无持续风向3-4级~微风</td>
  <td>NaN</td>
  <td>周三</td>
</tr>
df.to_excel('weather.xlsx',index=False)
posted @ 2023-09-05 00:30  慆慢险躁  阅读(22)  评论(0编辑  收藏  举报