美文网首页
04Pandas查询数据

04Pandas查询数据

作者: Viterbi | 来源:发表于2022-10-31 07:48 被阅读0次

[toc]

04 Pandas查询数据

Pandas查询数据的几种方法

    1. df.loc方法,根据行、列的标签值查询
    1. df.iloc方法,根据行、列的数字位置查询
    1. df.where方法
    1. df.query方法

.loc既能查询,又能覆盖写入,强烈推荐

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

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

注意

  • 以上查询方法,既适用于行,也适用于列
  • 注意观察降维dataFrame>Series>值

import pandas as pd

#  查看pandas版本
print(pd.__version__)

    1.0.1
        

0、读取数据

数据为北京2018年全年天气预报 该数据的爬虫教程参见我的Python爬虫系列视频课程

df = pd.read_csv("./datas/beijing_tianqi/beijing_tianqi_2018.csv")

df.head() # df.head(10)可以指定行数

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
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.set_index('ymd', inplace=True) # inplace 表示在当前这个dataframe修改

# 时间序列见后续课程,本次按字符串处理
df.index

    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)


df.head()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-01-01 3℃ -6℃ 晴~多云 东北风 1-2级 59 2
2018-01-02 2℃ -5℃ 阴~多云 东北风 1-2级 49 1
2018-01-03 2℃ -5℃ 多云 北风 1-2级 28 1
2018-01-04 0℃ -8℃ 东北风 1-2级 28 1
2018-01-05 3℃ -6℃ 多云~晴 西北风 1-2级 50 1

# 替换掉温度的后缀℃
# loc可以查看,也可以修改
# str属性,str属性和str的函数并不完全相同
# astype 修改数据类型
# loc 修改,[:, "bWendu"]所有行,的bWendu列
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')

df.dtypes

    bWendu        int32
    yWendu        int32
    tianqi       object
    fengxiang    object
    fengli       object
    aqi           int64
    aqiInfo      object
    aqiLevel      int64
    dtype: object


df.head()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-01-01 3 -6 晴~多云 东北风 1-2级 59 2
2018-01-02 2 -5 阴~多云 东北风 1-2级 49 1
2018-01-03 2 -5 多云 北风 1-2级 28 1
2018-01-04 0 -8 东北风 1-2级 28 1
2018-01-05 3 -6 多云~晴 西北风 1-2级 50 1

1、使用单个label值查询数据

行或者列,都可以只传入单个值,实现精确匹配

# 得到单个值
# loc[行索引,列索引]
df.loc['2018-01-03', 'bWendu']

    2

# 
# loc[行索引]
# 不能使用loc[列索引],选择列使用 df[列索引]
df.loc['2018-01-03']

Out[12]:
bWendu          2
yWendu         -5
tianqi         多云
fengxiang      北风
fengli       1-2级
aqi            28
aqiInfo         优
aqiLevel        1
Name: 2018-01-03, dtype: object


# 得到一个Series
df.loc['2018-01-03', ['bWendu', 'yWendu']]


    bWendu     2
    yWendu    -5
    Name: 2018-01-03, dtype: object

2、使用值列表批量查询

# 得到Series
df.loc[['2018-01-03','2018-01-04','2018-01-05'], 'bWendu']


    ymd
    2018-01-03    2
    2018-01-04    0
    2018-01-05    3
    Name: bWendu, dtype: int32


# 得到DataFrame
df.loc[['2018-01-03','2018-01-04','2018-01-05'], ['bWendu', 'yWendu']]
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
bWendu yWendu
ymd
2018-01-03 2 -5
2018-01-04 0 -8
2018-01-05 3 -6

3、使用数值区间进行范围查询

注意:区间既包含开始,也包含结束,这一点和python的切片不同,

# 行index按区间

df.loc['2018-01-03':'2018-01-05', 'bWendu']


    ymd
    2018-01-03    2
    2018-01-04    0
    2018-01-05    3
    Name: bWendu, dtype: int32


# 列index按区间
df.loc['2018-01-03', 'bWendu':'fengxiang']


    bWendu        2
    yWendu       -5
    tianqi       多云
    fengxiang    北风
    Name: 2018-01-03, dtype: object



# 行和列都按区间查询
df.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
bWendu yWendu tianqi fengxiang
ymd
2018-01-03 2 -5 多云 北风
2018-01-04 0 -8 东北风
2018-01-05 3 -6 多云~晴 西北风

4、使用条件表达式查询

bool列表的长度得等于行数或者列数

简单条件查询,最低温度低于-10度的列表


# loc里面是bool值,选择行,第二个选择列
df.loc[df["yWendu"]<-10, :]
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-01-23 -4 -12 西北风 3-4级 31 1
2018-01-24 -4 -11 西南风 1-2级 34 1
2018-01-25 -3 -11 多云 东北风 1-2级 27 1
2018-12-26 -2 -11 晴~多云 东北风 2级 26 1
2018-12-27 -5 -12 多云~晴 西北风 3级 48 1
2018-12-28 -3 -11 西北风 3级 40 1
2018-12-29 -3 -12 西北风 2级 29 1
2018-12-30 -2 -11 晴~多云 东北风 1级 31 1
# 观察一下这里的boolean条件
# 长度和行数或者列数,结果有列行索引
df["yWendu"]<-10



    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

复杂条件查询,查一下我心中的完美天气

注意,组合条件用&符号合并,每个条件判断都得带括号


## 查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
df.loc[(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1), :]


.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-08-24 30 20 北风 1-2级 40 1
2018-09-07 27 16 西北风 3-4级 22 1

我哭,北京好天气这么稀少!!

# 再次观察这里的boolean条件
(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1)




    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、调用函数查询


# 直接写lambda表达式
# 这里lamdba 参数就是df,lamdba 返回结果是一个bool的列表
df.loc[lambda df : (df["bWendu"]<=30) & (df["yWendu"]>=15), :]


.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-04-28 27 17 西南风 3-4级 125 轻度污染 3
2018-04-29 30 16 多云 南风 3-4级 193 中度污染 4
2018-05-04 27 16 晴~多云 西南风 1-2级 86 2
2018-05-09 29 17 晴~多云 西南风 3-4级 79 2
2018-05-10 26 18 多云 南风 3-4级 118 轻度污染 3
... ... ... ... ... ... ... ... ...
2018-09-15 26 15 多云 北风 3-4级 42 1
2018-09-17 27 17 多云~阴 北风 1-2级 37 1
2018-09-18 25 17 阴~多云 西南风 1-2级 50 1
2018-09-19 26 17 多云 南风 1-2级 52 2
2018-09-20 27 16 多云 西南风 1-2级 63 2

64 rows × 8 columns


# 编写自己的函数,查询9月份,空气质量好的数据
def query_my_data(df):
    return df.index.str.startswith("2018-09") & (df["aqiLevel"]==1)
    
df.loc[query_my_data, :]

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
bWendu yWendu tianqi fengxiang fengli aqi aqiInfo aqiLevel
ymd
2018-09-01 27 19 阴~小雨 南风 1-2级 50 1
2018-09-04 31 18 西南风 3-4级 24 1
2018-09-05 31 19 晴~多云 西南风 3-4级 34 1
2018-09-06 27 18 多云~晴 西北风 4-5级 37 1
2018-09-07 27 16 西北风 3-4级 22 1
2018-09-08 27 15 多云~晴 北风 1-2级 28 1
2018-09-15 26 15 多云 北风 3-4级 42 1
2018-09-16 25 14 多云~晴 北风 1-2级 29 1
2018-09-17 27 17 多云~阴 北风 1-2级 37 1
2018-09-18 25 17 阴~多云 西南风 1-2级 50 1
2018-09-21 25 14 西北风 3-4级 50 1
2018-09-22 24 13 西北风 3-4级 28 1
2018-09-23 23 12 西北风 4-5级 28 1
2018-09-24 23 11 北风 1-2级 28 1
2018-09-25 24 12 晴~多云 南风 1-2级 44 1
2018-09-29 22 11 北风 3-4级 21 1
2018-09-30 19 13 多云 西北风 4-5级 22 1

本文使用 文章同步助手 同步

相关文章

  • 04Pandas查询数据

    [toc] 04 Pandas查询数据 Pandas查询数据的几种方法 df.loc方法,根据行、列的标签值查询 ...

  • arango的AQL

    arango实践 插入数据模板 修改数据模板 插入数据 查询数据 复杂查询 多表查询 图查询

  • arango增删改查

    arango实践 插入数据 修改数据 插入数据 查询数据 复杂查询 多表查询

  • Beego使用原生SQL

    创建RawDemo QueryRow查询 QueryRows查询 Values查询 更新数据 添加数据 删除数据

  • Mysql查询今天和昨天等

    create_time为时间字段名查询今天的数据 查询昨天的数据 查询近7天的数据 查询近30天的数据 查询本月的...

  • SQL之DQL

    DQL用于从数据库查询数据,并不会修改数据 基本查询 条件控制 查询排序 分组查询 limit限制 一.基本查询 ...

  • mysql按时间段查询

    今天 昨天 7天 近30天 本月 上一月 查询本季度数据 查询上季度数据 查询本年数据 查询上年数据 查询当前这周...

  • mysql 查询当天、本周,本月,上一个月的数据

    今天 昨天 近7天 近30天 本月 上一月 查询本季度数据 查询上季度数据 查询本年数据 查询上年数据 查询当前这...

  • mysql 查询当天、本周,本月,上一个月的数据

    今天 昨天 近7天 近30天 本月 上一月 查询本季度数据 查询上季度数据 查询本年数据 查询上年数据 查询当前这...

  • EF Core—查询数据

    查询数据 Entity Framework(EF) Core 使用语言集成查询 (LINQ) 来查询数据库中的数据...

网友评论

      本文标题:04Pandas查询数据

      本文链接:https://www.haomeiwen.com/subject/qsqxtdtx.html