pandas之DataFrame基础

news2024/11/29 5:45:22

pandas之DataFrame基础

  • 1. DataFrame定义
  • 2. DataFrame的创建形式
  • 3. DataFrame的属性
  • 4. DataFrame的运算
  • 5. pandas访问相关操作
    • 5.1 使用 loc[]显示访问
    • 5.2 iloc[] 隐式访问
    • 5.3 总结
  • 6. 单层索引和多层级索引
    • 6.1 索引种类与使用
    • 6.2 索引相关设置
    • 6.3 索引构造
    • 6.4 索引访问
    • 6.5 索引变换

1. DataFrame定义

  • DataFrame是一个二维的表格型数据结构,可以看做是由Series组成的字典(共用同一个索引)
  • DataFrame由按一定顺序排列的【多列】数据组成,每一列的数据类型可能不同
  • 设计初衷是将Series的使用场景从一维拓展到多维,DataFrame即有行索引,也有列索引

2. DataFrame的创建形式

  • 使用列表创建,并设置行索引列索引

    #data:构造DataFrame的数据
    pd.DataFrame(data=data, index=index, columns=columns)
    data=np.random.randint(0,100,size=(3,4))
    index=['tom','lucy','alex']
    columns=['语文','数学','物理','化学']
    df1=pd.DataFrame(data=data,index=index,columns=columns)
    
  • from dict of Series or dicts 使用一个由Series构造的字典或一个字典构造

    #通过字典套Series方式创造DataFrame
    names=pd.Series(data=['lucy','mery','tom'],index=list('ABC'))
    scores=pd.Series(data=np.random.randint(0,100,size=3),index=list('ABC'))
    df2=pd.DataFrame(data={
        "names":names,
        "scores":scores
    })
    
  • from dict of ndarrays/lists使用一个由列表或ndarray构造的字典构造,ndarrays必须长度保持一致

    #通过字典套列表创建DataFrame
    dic={
        'name':['user1','user2'],
        'score':[90,80]
    }
    df3=pd.DataFrame(data=dic)
    
  • from a list of dicts 使用一个由字典构成的列表构造

    #列表套字典创建DataFrame
    dic1={
        'name':'lucy',
        'score':90
    }
    dic2={
        'name':'user',
        'score':80
    }
    lis=[dic1,dic2]
    df4=pd.DataFrame(data=lis)
    
  • DataFrame.from_dict()函数构造

    #字典套ndarry构造
    names=['lucy','tom']
    yuwen=np.random.randint(0,100,size=2)
    shuxue=np.random.randint(0,100,size=2)
    dic={
        "name":names,
        "语文":yuwen,
        '数学':shuxue
    }
    df5=pd.DataFrame(data=dic)
    

3. DataFrame的属性

属性含义
index行索引
columns列索引
values
dtype列数据类型
score=pd.DataFrame(data={
    "name":pd.Series(data=['lucy','mery','tom'],index=list('ABC')),
    "score":pd.Series(data=np.random.randint(0,100,size=3),index=list('ABC'))
})
score.dtypes  #列数据类型   
# name     object
# score     int32
# dtype: object

score.values  #获取所有值  array([['lucy', 66], ['mery', 88],['tom', 71]], dtype=object)
score.index  #列索引  Index(['A', 'B', 'C'], dtype='object')
score.columns  #行索引  Index(['name', 'score'], dtype='object')

4. DataFrame的运算

  • 与非pandas对象的运算 【服从广播机制】

    运算方式运算含义相关代码
    与数值相加各个位置都会加上这个数值 【广播机制】在这里插入图片描述
    列相同对应列位置相加在这里插入图片描述
    行列不同不可加,DataFrame是根据索引匹配,不匹配报错在这里插入图片描述
df=pd.DataFrame(data=np.random.randint(0,100,size=(3,4)),columns=list('ABCD'))
 df+10
 arr1=np.array([1,2,3,4])
 df + arr1
 arr2=np.random.randint(0,20,size=(2,2))
 df + arr2
  • Series对象运算

    • DateFrameSeries运算,默认是列索引对齐原则,不匹配,补NaN

    • add函数指定轴向index为行,不匹配补NaN

      s=pd.Series(data=[1,2,3],index=[1,2,3])
      df=pd.DataFrame(data=np.random.randint(0,100,size=(3,4)),columns=list('ABCD'))
      s+df
      df.add(s,axis='index')
      

      在这里插入图片描述

  • DataFrame对象运算

    对齐方式方法
    索引对齐原则(row/columns)
    对不齐补空值使用add/sub/mul/div函数处理空值
  • python操作符与pandas操作函数的对应表

    • 根据索引匹配,不匹配补NaN,匹配进行运算
    • 填充方式:根据索引匹配,不匹配适用fill_value填充,匹配进行运算
      • 注意:DataFrameSeries运算,不支持fill_value属性
    字符函数
    +add()
    - sub(),subtract()
    *mul(),multiply()
    / truediv(),div(),divide()
    //floordiv()
    %mod()
    **pow()
    df1=pd.DataFrame(data=np.random.randint(0,10,size=(3,3)),columns=list('ABC'))
    df2=pd.DataFrame(data=np.random.randint(0,10,size=(2,2)),columns=list('BA'))
    df1+df2
    df1.add(df2,fill_value=0) 
    

    在这里插入图片描述

  • numpy functions

    arr = np.random.randint(-10, 10, size=(3,3))
    df=pd.DataFrame(data=arr)
    #求每个数的绝对值
    np.abs(df)
    

    在这里插入图片描述

  • 转置运算

    df=pd.DataFrame(data=np.random.randint(-10,10,size=(3,3)))
    #对角线翻转
    df.T
    

    在这里插入图片描述

5. pandas访问相关操作

ndarray(ndim_index,ndim_index2…)
ndim_index支持:索引,索引列表,bool列表,切片,条件表达式

  • 注意:使用索引切片都是左闭右开,使用标签切片的都是闭合区间
访问形式含义
loc[]显示访问:在pandas对象中,可以使用标签的形式访问数据
iloc[]隐式访问,在pandas对象中,也可以使用index的形式访问数据

5.1 使用 loc[]显示访问

s.loc[index]
s.loc[row_index,col_index]
index支持:索引(index),索引列表(index_list),布尔列表(bool_list),条件表达式,切片(左闭右开)

显示索引访问形式相关代码
df.loc[0,'A']取指定位置的数,第0行,第A
df.loc[0]获取指定行,默认取行索引
df.loc[:,['A','B']]AB列,但是不能跳过行索引直接取列索引,所以前面用切片取所有
df.loc[[1,2],['B','C']]前两行,AB列
df.loc[np.array([True,False,False,False,False])] 通过bool列表获取列,bool长度要与行一致
bool_list=pd.Series(data=np.array([True,True,False,False,False,True]),index=[0,4,1,2,3,5]) df.loc[bool_list] 创建Series,将行0,4,5行设为True,其他为False,取所要的行
bool_list=pd.Series(data=np.array([True,True,False,False,False,True]),index=[0,4,1,2,3,5]) df.loc[:,bool_list.values]获取所有行,将bool_listbool值赋值给列
s.loc['b':'c'] 切片访问,显示索引闭合区间,左闭右闭
s.loc[['b','c']]索引访问
s.loc[[False,True,True,False,False]]布尔值访问
s.loc[s>6] 条件语句访问
df = pd.DataFrame(data=np.random.randint(0,10,size=(5,6)), columns=list('ABCDEF'))
df.loc[0,'A']      
df.loc[0]            
df.loc[:,['A','B']] 
df.loc[[1,2],['B','C']]
df.loc[np.array([True,False,False,False,False])]
bool_list=pd.Series(data=np.array([True,True,False,False,False,True]),index=[0,4,1,2,3,5])
df.loc[bool_list]
df.loc[:,bool_list.values]  
s=pd.Series(data=np.random.randint(0,10,size=5),index=list('abcde'))
s.loc['b':'c']
s.loc[['b','c']]
s.loc[[False,True,True,False,False]]
s.loc[s>6]

5.2 iloc[] 隐式访问

s.iloc[index]
s.iloc[row_index,col_index]
index支持:索引(index),索引列表(index_list),布尔列表(bool_list),条件表达式,切片(左闭右开)

隐示索引访问形式相关代码
df.iloc[:,0]获取所有行,第一列
df.iloc[0:3]获取所有行,0,1,2【切片获取,左闭右开】
df.iloc[[True,False,True,False,False]]bool列表获取索引
df = pd.DataFrame(data=np.random.randint(0,10,size=(5,6)), columns=list('ABCDEF'))
df.iloc[:,0]
df.iloc[[True,False,True,False,False]]
df.iloc[0:3]
  • 间接访问

    df = pd.DataFrame(data=np.random.randint(0,10,size=(5,6)), columns=list('ABCDEF'))
    #间接访问,不提倡,赋值时会分不清到底修改了谁
    df.loc[0].loc['B']=10
    #标签访问列
    df[['A','B']]
    #切片访问行
    df[0:2]
    

5.3 总结

  • 注意:直接用中括号访问
  • 标签访问的是列,标签切片访问的是行

6. 单层索引和多层级索引

6.1 索引种类与使用

  • 怎么使用索引?

    • pd.Indexpandas提供的专门用于构造索引的类,它有很多类,CategoricalIndex,RangeIndex
    • 所有的子类都具备Index类的特点,比如可以使用索引访问元素
    • 通常如果需要对索引定制(name),可以使用pd.Index系列方法来构造索引
    • 如果没有特殊需求,使用普通的列表完全没有问题
  • 索引种类【不是很知道区别,实际好像没有用到过】

种类含义
RangeIndex实现单调整数范围的索引.
CategoricalIndex索引类分类
MultiIndex多级索引
IntervalIndex类间隔索引
DatetimeIndex, TimedeltaIndex, PeriodIndex,Int64Index, UInt64Index, Float64Index其他种类

6.2 索引相关设置

索引相关设置代码
重新设置index索引df.index=list('abcde')
重新设置columns索引df.columns = [1,2,3]
设置索引名称为indexpd.RangeIndex(start=0,stop=5,step=1,name='index')
其他pd对象索引赋值给另一个pd对象df.index=m_index
df=pd.DataFrame(data=np.random.randint(0,10,size=(5,3)),columns=list('ABC'))
df.index=list('abcde')
df.columns = [1,2,3]
m_index=pd.RangeIndex(start=0,stop=5,step=1,name='index')
df.index=m_index

6.3 索引构造

  • 单层索引,使用pd.index()

  • 多层索引构造

    • 使用arrays MultiIndex.from_arrays()
    columns=pd.MultiIndex.from_arrays([['第一学期','第一学期','第一学期','第二学期','第二学期','第二学期'],
                                       ['lucy','tom','hello','lucy','tom','hello']])
    index=list('ABC')
    data=np.random.randint(0,100,size=(3,6))
    df=pd.DataFrame(data=data,index=index,columns=columns)
    #可以直接作为多层索引使用,不需要构造MutiIndex对象
    #pd.MutiIndex.from_arrays([必须是一个额为数组结构])
    #模范,不采用,理解即可
    
    • 使用tuple pd.MulitiIndex.from_tuples

      tuples=pd.MultiIndex.from_tuples([
          ('第一期','lucy'),
          ('第一期','tom'),
          ('第一期','hello'),
          ('第二期','lucy'),
          ('第二期','tom'),
          ('第二期','hello'),
      ])
      index=list('ABC')
      data=np.random.randint(0,100,size=(3,6))
      df=pd.DataFrame(data=data,index=index,columns=columns)
      
    • 使用product pd.MultiIndex.from_product

      level1=['第一期','第二期']
      level2=['A','B','C']
      #level1与level2自动匹配
      #列索引为期数与产品
      data=np.random.randint(0,100,size=(3,6))
      columns=pd.MultiIndex.from_product([level1,level2],names=['期数','产品'])
      index=pd.Index(data=['lucy','tom','hello'],name='销售员')
      df=pd.DataFrame(data=data,index=index,columns=columns)
      
      level1=['第一期','第二期']
      level2=['A','B','C']
      #行索引为期数与销售员
      index=pd.MultiIndex.from_product([['第一期','第二期'],['lucy','tom','hello']],names=['期数','销售员'])
      columns=pd.Index(data=['A','B','C'],name='产品')
      data = np.random.randint(0, 100, size=(6,3))
      df=pd.DataFrame(data=data,index=index,columns=columns)
      

6.4 索引访问

  • 多层索引访问逻辑
    • 多层索引的访问逻辑,与单层索引的访问逻辑完全一致
    • 但是:多层索引的索引表达形式是以元组的方式处理的
  • 多层索引创建
    level1,level2=['第一期','第二期'],['lucy','tom','hello']
    #行索引为期数与销售员
    index=pd.MultiIndex.from_product([level1,level2],names=['期数','销售员'])
    columns=pd.Index(data=['A','B','C'],name='产品')
    data = np.random.randint(0, 100, size=(6,3))
    df=pd.DataFrame(data=data,index=index,columns=columns)
    
    在这里插入图片描述
  • 多层索引访问【元祖形式访问】
    #显示索引
    df.loc[('第一期','hello')]
    df.loc[[('第一期','lucy'),('第二期','lucy')]]
    df.loc['第一期'].loc['tom']
    df.sort_index(inplace=True)
    #使用babels
    df.loc[('第一期','lucy'):('第二期','lucy')]
    

在这里插入图片描述

6.5 索引变换

  • unstack把行索引向列索引变换

      level1,level2=['第一期','第二期'],['lucy','tom','hello']
      #行索引为期数与销售员
      index=pd.MultiIndex.from_product([level1,level2],names=['期数','销售员'])
      columns=pd.Index(data=['A','B','C'],name='产品')
      data = np.random.randint(0, 100, size=(6,3))
      df=pd.DataFrame(data=data,index=index,columns=columns)
      display(df,df.unstack())  
    

在这里插入图片描述

  • stcak把列索引向行索引变换

    df.stack()
    

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/416815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BGP选路实验(重点是各种策略)

实验拓扑 基础配置(完成IGP的配置) 首先完成各 个接口IP地址,环回接口地址等一些基本配置,实现直连之间的互相通信 在R4,R5上的配置类似 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 192.168.1.1 24 [Huawei-GigabitEthernet0/0/0]int g0/0…

低代码是什么意思

此前,阿里云智能总裁张建锋曾在钉钉发布会上表示:“未来的软件开发一定是碎片化的,低代码开发将成为未来几年的行业关键词。”这句话表明了低代码在过去两年的火爆程度,预示着低代码有望成为软件领域的新风口。 那低代码是什么意…

chatgpt智能提效职场办公-excel表格6-6-6格式怎么设置(数字按照三个数字一组进行分隔)

chatgpt智能提效职场办公-excel表格6-6-6格式怎么设置(数字按照三个数字一组进行分隔) 作者:虚坏叔叔 博客:https://xuhss.com 早餐店不会开到晚上,想吃的人早就来了!😄 在Excel表格中设置6-6-…

移除元素(数组篇)

27. 移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中…

004:Mapbox GL设定不同的style,更换底图形态

第004个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中设定不同的style,更换底图形态 。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共70行)相关API参考:专栏目标示例效果

「业务架构」需求工程—需求规范(第3部分)

将用户和系统需求记录到文档中。需求规范它是将用户和系统需求写入文档的过程。需求应该是清晰的、容易理解的、完整的和一致的。在实践中,这是很难实现的,因为涉众以不同的方式解释需求,并且在需求中经常存在固有的冲突和不一致。正如我们之…

GraphInsight 拓扑图体验

蚂蚁数据可视化 | G6📚前言📚使用说明📕数据规则节点的属性📚前言 蚂蚁数据可视化 G6 图可视化引擎是一个简单、易用、完备的图可视化引擎,它在高定制能力的基础上,提供了一系列设计优雅、便于使用的图可视…

1~3年的测试工程师薪资陷入了瓶颈期,如何突破自己实现涨薪?

对于技术人员而言,职业规划一般分为两个方向:做技术、做管理。进入软件测试行业的新人都会从最基础的执行开始,然后是基本的功能测试。 随后大家会根据个人职业发展来进一步细化,有的走管理路线,成为主管、经理、项目…

《操作系统》by李治军 | 实验3 - 系统调用

目录 一、实验内容 二、实验准备 1、系统调用的具体流程 (一)调用接口函数 API (二)触发 0x80 号中断 (三)跳转到 system_call 函数 (四)执行系统调用函数 sys_xxx 2、总结概…

19从零开始学Java之局部变量和成员变量是怎么回事?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前两篇文章中,壹哥给大家讲解了Java里的条件分支,包括if和switch两种情况。…

23.Spring练习(spring、springMVC)

目录 一、Spring练习环境搭建。 (1)设置服务器启动的展示页面。 (2)创建工程步骤。 (3)applicationContext.xml配置文件。 (4)spring-mvc.xml配置文件。 (5&#x…

Java集合——Set接口学习总结

一、HashSet实现类 1.常用方法 增加&#xff1a;add(E e)删除&#xff1a;remove(Object o)、clear()修改&#xff1a;查看&#xff1a;iterator()判断&#xff1a;contains(Object o)、isEmpty()常用遍历方式&#xff1a;Set<String> set new HashSet<String>()…

redis中布隆过滤器使用详解

文章目录一、布隆过滤器介绍1、什么是布隆过滤器2、布隆过滤器实现原理3、误判率4、布隆过滤器使用场景5、哈希表与布隆过滤器比较二、redis中布隆过滤器实战1.引入redisson依赖2.创建订单表3.配置redis4.配置BloomFilter5.创建订单6.单元测试总结一、布隆过滤器介绍 1、什么是…

什么是汽车以太网?

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录什么是汽车以太网&#xff1f;汽车以太网市场中使用的标准和剖析汽车以太网类型什么是汽车以太网&#xff1f; 本页介绍了汽车以太网的基本特性并提到了汽车以…

【数据库】关系数据库

1.选择关系&#xff08;对行操作&#xff09; 2.投影&#xff08;对列操作&#xff09; &#xff08;行记录重复的不再显示&#xff09; 3.连接&#xff08;从两个关系的笛卡尔积中选出属性间满足一定条件的元组&#xff09; a.等值连接 b.自然连接&#xff08;等值连接的特殊…

【云原生Docker】08-Docker存储

【云原生|Docker】08-Docker存储 文章目录【云原生|Docker】08-Docker存储简介Docker存储挂载方式挂载方式介绍挂载主机目录数据卷容器特性Docker存储示例挂载主机目录Type: bindType: volume总结数据卷容器利用数据卷容器迁移数据备份数据&#xff1a;恢复数据&#xff1a;Doc…

【小程序】小程序组件-1

一. form组件的使用 这个点自己写的时候卡了好久&#xff0c;比较有感悟。 首先明确一点&#xff0c;为什么需要form。 form可以封装一个模块&#xff0c;这个模块里可以有多个input操作&#xff0c;多个输出接口&#xff0c;多个按键&#xff0c;但是至多有两个关键按键&am…

“QT快速上手指南”之计算器(一)Qt Creator,窗口组件

文章目录前言一、什么是QT&#xff1f;二、准备工作&#xff1a;1. 安装Qt Creator&#xff1a;2. 安装Qt SDK&#xff1a;3. 下载安装器&#xff1a;三、窗口组件&#xff1a;四、QT 基本组件的简单介绍&#xff1a;1. QWidget2. QPushButton3. QLabel4. QLineEdit5. QSpinBox…

智能火焰与烟雾检测系统(Python+YOLOv5深度学习模型+清新界面)

摘要&#xff1a;智能火焰与烟雾检测系统用于智能日常火灾检测报警&#xff0c;利用摄像头画面实时识别火焰与烟雾&#xff0c;另外支持图片、视频火焰检测并进行结果可视化。本文详细介绍基于智能火焰与烟雾检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的…

FPGA基于XDMA实现PCIE X4视频采集HDMI输出 提供工程源码和QT上位机程序和技术支持

目录1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案5、vivado工程详解6、驱动安装7、QT上位机软件8、上板调试验证9、福利&#xff1a;工程代码的获取1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串行连接&#xff0c;比起 PCI …