当前位置: 首页 > news >正文

pandas中的数据结构+数据查询

pandas 数据结构

Series

  • Series是一种类似于一维数组的对象,它由一组数据(不同数据类型)以及一组与之相关的数据标签(即索引)组成。

列表创建

  • 仅有数据列表即可产生最简单的Series

    s1 = pd.Series([1,'a',5.2,7])
    '''左侧为索引,右侧是数据'''
    s1
    
    """输出如下"""
    0      1
    1      a
    2    5.2
    3      7
    dtype: object
    

    获取索引

    '''获取索引'''
    s1.index
    
    """输出如下"""
    RangeIndex(start=0, stop=4, step=1)
    

    获取数据

    ''' 获取数据'''
    s1.values
    
    """输出如下"""
    array([1, 'a', 5.2, 7], dtype=object)
    

创建标签索引

  • 创建一个具有标签索引的Series

    s2 = pd.Series([1, 'a', 5.2, 7], index=['d','b','a','c'])
    s2
    
    """输出如下"""
    d      1
    b      a
    a    5.2
    c      7
    dtype: object
    

    获取索引:

    s2.index
    
    """输出如下"""
    Index(['d', 'b', 'a', 'c'], dtype='object')
    

字典创建

  • 使用Python字典创建Series

    sdata={'Ohio':35000,'Texas':72000,'Oregon':16000,'Utah':5000}
    s3=pd.Series(sdata)
    s3
    
    """输出如下"""
    Ohio      35000
    Texas     72000
    Oregon    16000
    Utah       5000
    dtype: int64
    

根据标签索引查询数据

  • 类似Python的字典dict

    s2
    
    """输出如下"""
    d      1
    b      a
    a    5.2
    c      7
    dtype: object
    
    s2['a']
    
    """输出如下"""
    5.2
    
    type(s2['a'])
    
    """输出如下"""
    float
    
    s2[['b','a']]
    
    """输出如下"""
    b      a
    a    5.2
    dtype: object
    
    type(s2[['b','a']])
    
    """输出如下"""
    pandas.core.series.Series
    

DataFrame

  • DataFrame是一个表格型的数据结构

    1. 每列可以是不同的值类型(数值、字符串、布尔值等)

    2. 既有行索引index,也有列索引columns

    3. 可以被看做由Series组成的字典

    创建dataframe最常用的方法,见02节读取纯文本文件、excel、mysql数据库

多个字典创建

  • 根据多个字典序列创建dataframe

    data={
            'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
            'year':[2000,2001,2002,2001,2002],
            'pop':[1.5,1.7,3.6,2.4,2.9]
        }
    df = pd.DataFrame(data)
    df
    

    202107131oNCq4

    每一列的数据类型

    # 每一列的数据类型
    df.dtypes
    
    """输出如下"""
    state     object
    year       int64
    pop      float64
    dtype: object
    

    查看所有的列名

    # 查看所有的列名(特征名称、或者理解为列的索引)
    df.columns
    """输出如下"""
    Index(['state', 'year', 'pop'], dtype='object')
    

    查看行索引

    # 查看行索引
    df.index
    """输出如下"""
    RangeIndex(start=0, stop=5, step=1
    

从DataFrame中查询出Series

  • 从DataFrame中查询出Series

    1. 如果只查询一行、一列,返回的是pd.Series
    2. 如果查询多行、多列,返回的是pd.DataFrame
    df
    

    202107131oNCq4

查询多列

  • 查询多列,结果是一个pd.DataFrame

    df[['year', 'pop']]
    """输出如下"""
    

    type(df[['year', 'pop']])
    
    """输出如下"""
    pandas.core.frame.DataFram
    

查询一行

  • 查询一行,结果是一个pd.Series

    df.loc[1]
    
    """输出如下"""
    state    Ohio
    year     2001
    pop       1.7
    Name: 1, dtype: object  
    
    type(df.loc[1])
    
    """输出如下"""
    pandas.core.series.Series
    

查询多行

  • 查询多行,结果是一个pd.DataFrame

    查询第2-4行

    df.loc[1:3]
    
    """输出如下"""
    

    20210817M95b2E

    type(df.loc[1:3])
    
    """输出如下"""
    pandas.core.frame.DataFrame
    

三、Pandas查询数据

  • Pandas查询数据的几种方法

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

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

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

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

    1. 以上查询方法,既适用于行,也适用于列
    2. 注意观察降维dataFrame>Series>值
    print(pd.__version__)
    
      1.1.5
    

读取数据

  • 数据为北京2018年全年天气预报

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

    20210812O5Rokc

    设定索引为日期

    # 设定索引为日期,方便按日期筛选
    df.set_index('ymd', inplace=True)
    
    # 时间序列见后续,本次按字符串处理
    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.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()
    """输出如下"""
    

    20210812CGL2RA

查询数据

单个label

  • 使用单个label值查询数据

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

    得到单个值 (2018年1月3日的最高温度)

    # 得到单个值 (2018年1月3日的最高温度)
    df.loc['2018-01-03', 'bWendu']
    
    """输出如下"""
    2
    

    得到一个Series(2018年1月3日的最高温度和最低温度)

    # 得到一个Series(2018年1月3日的最高温度和最低温度)
    df.loc['2018-01-03',['bWendu','yWendu']]
    
    """输出如下"""
    bWendu     2
    yWendu    -5
    Name: 2018-01-03, dtype: object
    

批量查询

  • 使用值列表批量查询

    得到Series:18年1月3,4,5日的最高温度

    # 得到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:18年1月3,4,5日的最高温度和最低温度

    # 得到DataFrame
    df.loc[['2018-01-03','2018-01-04','2018-01-05'], ['bWendu', 'yWendu']]
    
    """输出如下"""
    

    image-20210812170718191

范围查询

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

    注意:区间既包含开始,也包含结束

    行index按区间 (2018年1月3日至5号的最高温度和最低温度)

    # 行index按区间 (2018年1月3日至5号的最高温度和最低温度)(series)
    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按区间

    # 列index按区间(series)
    df.loc['2018-01-03', 'bWendu':'fengxiang']
    
    """输出如下"""
    bWendu        2
    yWendu       -5
    tianqi       多云
    fengxiang    北风
    Name: 2018-01-03, dtype: object
    

    行和列都按区间查询

    # 行和列都按区间查询(DataFrame)
    df.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']
    
    """输出如下"""
    
    
    

    202108126XPzAB

使用条件表达式查询

  • bool列表的长度得等于行数或者列数
简单条件查询
  • 简单条件查询,最低温度低于-10度的列表

    df.loc[df['yWendu']<-10,:]
    
    """输出如下"""
    

    20210812jDOl8U

    观察一下这里的boolean条件

    # 观察一下这里的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度,并且是晴天,并且天气为优的数据

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

    20210812hoALwx

    再次观察这里的boolean条件

    # 再次观察这里的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
    

调用函数查询

lambda表达式
  • 直接写lambda表达式

    # 直接写lambda表达式
    df.loc[lambda df : (df["bWendu"]<=30) & (df["yWendu"]>=15), :]
    
    """输出如下"""
    

    20210812LyQT5B

编写函数
  • 自己编写函数

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

    20210812JOKx3h


相关文章:

  • 用markdown 写简历
  • 821 字符的最短距离
  • c++进阶之----二叉搜索树
  • 【射频仿真学习笔记】Cadence的Layout EXL与ADS dynamic link联动后仿
  • 【组态PLC】基于西门子s7-200PLC和组态王中央空调的循环控制系统【含PLC组态源码 M019期】
  • Java注解的原理
  • Kotlin 随记 (1)
  • RAG-202502
  • Mellanox的LAG全称是什么?网卡的创建机制如何?(Link Aggregation Group 链路聚合组)
  • WiFi IEEE 802.11协议精读:IEEE 802.11-2007,6,MAC service definition MAC服务定义
  • TinyEngine v2.2版本发布:支持页面嵌套路由,提升多层级路由管理能力开发分支调整
  • HBase常用的Filter过滤器操作
  • Spring Data JPA vs MyBatis:ORM框架如何选择?
  • 【IntelliJ IDEA】关于设置固定的文件格式(包括注释、版权信息等)的方法
  • 轨迹控制--odrive的位置控制---负载设置
  • lmstdio大模型——本地大模型python函数调用设计
  • Python中有哪些基本数据类型?
  • 软考~系统规划与管理师考试——真题篇——2021年5月——论文——纯享题目版
  • ClickHouse 的分区、分桶和分片详解
  • 计算机毕业设计SpringBoot+Vue.js学科竞赛管理系统(源码+文档+PPT+讲解)
  • 俄外长:俄将在不损害伙伴关系前提下发展对美关系
  • 兴业银行一季度净赚超237亿降逾2%,营收降逾3%
  • 文天祥与“不直人间一唾轻”的元将唆都
  • “不意外”和“不遗余力”,直击上海商超对接外贸企业
  • 监狱法修订草案提请全国人大常委会会议审议
  • 外交部:对伊朗拉贾伊港口爆炸事件遇难者表示深切哀悼