Python——Pandas(第二讲)

文章目录

  • 变量类型的转换
    • Pandas 支持的数据类型
    • 在不同数据类型间转换
  • 建立索引
    • 新建数据框时建立索引
    • 读入数据时建立索引
    • 指定某列为索引列
    • 将索引还原变量列
  • 引用和修改索引
    • 引用索引
    • 修改索引
      • 修改索引名
      • 修改索引值
    • 更新索引
  • Series的索引和切片
  • DataFrame的索引和切片
    • 选择列
    • 按行列索引选择
    • isin()选择
    • query()的使用
  • 排序
    • 用索引排序
    • 使用变量值排序
  • 计算新变量
    • 新变量为常数
    • 基于原变量做简单四则运算
    • 基于一个原变量做函数运算
    • 在指定位置插入新变量列

变量类型的转换

Pandas 支持的数据类型

具体类型是 Python, Numpy 各种类型的混合,可以下分的更细:

  • float
  • int
  • string
  • bool
  • datetime64[nsr] datetime64[nsr,tz] timedelta[ns]
  • category
  • object

df.dtypes :査看各列的数据类型

df.dtypes

在不同数据类型间转换

df.astype(dtype :指定希望转换的数据类型,可以使用 numpy 或者 python 中的数据类型: int/float/bool/strcopy = True :是否生成新的副本,而不是替换原数据框errors = 'raise' : 转换出错时是否抛出错误,raise/ ignore )
#将df里所有的列转换成str
df.astype('str')
df.astype('str').dtypes
#修改某一列数据的数据类型
df.column.astype ('str')
#转换错误
df.astype('int', errors = 'ignore').dtypes 

明确指定转换类型的函数:

  • 旧版本方法:
    • pd.to_datetime ()
    • pd.to_timedelta ()
    • pd.to_numeric ()
    • df.to_string()

可以通过 df. apply 来批量逬行多列的转换
pd. to_numeric (df .cloumn)

#转换单列
pd.to_numeric(df.软件)
#选择多列进行转换
df [['cloumn1','cloumn2']].astype('str').apply(pd. to_numeric).dtypes

建立索引

新建数据框时建立索引

所有的数据框默认都已经使用从 0 开始的自然数索引,因此这里的"建立”索引指的是自定义索引

df = pd.DataFrame( {'varl' : 1.0, ' var2' :[1,2,3,4], 'var3' : ['test', 'python','test','hello'] , 'var4' : 'cons'} , index =[0,1,2,3])
'''varl	var2	var3	var4
0	1.0	       1	test	cons
1	1.0	       2	python	cons
2	1.0	       3	test	cons
3	1.0	       4	hello	cons
'''

读入数据时建立索引

使用现有列

df = pd.read_csv ("filename",index_col="column”)

使用复合列

df = pd.read_csv ("filename", index_col=[0,1..])

指定某列为索引列

df.set_index(keys :被指定为索引的列名,复合索引用 list:格式提供drop = True :建立索引后是否删除该列append = False :是否在原索引基础上添加索引,默认是直接替换原索引       inplace = False :是否直接修改原数据框 )
# 示例
df_new = df.set_index (keys=['学号''性别'],drop = False)
df_new = df.set_index (keys='学号',append=True, drop=False)

将索引还原变量列

df.reset_index(
drop = False :是否将原索引直接删除,而不是还原为变量列
inplace = False :是否直接修改原数据框
)

df.set_index (['col1','col2','col3'])

将索引全部还原为变量

df.reset_index ()

是否删除 index 列

df.reset_index (drop=True)

引用和修改索引

引用索引

  • 注意:索引仍然是有存储格式的,注意区分数值型和字符型的引用方式
df.index

修改索引

修改索引名

本质上和变量列名的修改方式相同

df = pd.DataFrame({'name':['zs','ls','ww'],'level':['vip1','vip2','pm']})
'''name	level
0	zs	    vip1
1	ls	    vip2
2	ww	    pm
'''
df.index.name='sno'
'''
sno	 name	level
0	 zs	    vip1
1	 ls	    vip2
2	 ww	    pm
'''

示例用法

df2 = pd.read_excel('stu_data.xlsx')
df3 = df2.set_index(keys = '学号')
df4 = pd.read_excel('stu_data.xlsx')
df5 = df2.set_index(keys = ['学号','性别'])
df5.index.names = ['no','sex']
df5.index.names=[None,None]

修改索引值

df.index = ['a', 'b', 'c']

更新索引

reindex 则可以使用数据框中不存在的数值建立索引,并据此扩充
新索引值对应的索引行/
列,同时进行缺失值填充操作。
df.reindex(
**labels 😗*类数组结构的数值,将按此数值重建索引,非必需
**copy = True 😗*建立新对象而不是直接更改原 df/series 缺失数据的处理方式
**method 😗*针对已经排序过的索引,确定数据单元格无数据时的填充方法,非必需
**pad / ffill:**用前面的有效数值填充
**backfill / bfill:**用后面的有效数值填充
**nearest:**使用最接近的数值逬行填充
**fill_value = np.NaN 😗*将缺失值用什么数值替代
**limit = None 😗*向前/向后填充时的最大步长
)

df = pd.DataFrame({'name':['zs','ls','ww'],'level':['vip1','vip2','pm']})
'''name	level
0	zs	    vip1
1	ls	    vip2
2	ww	    pm
'''
df.reindex([0,1,3])
'''
name	level
0	zs	    vip1
1	ls	    vip2
3	ww	    pm
'''
df.reindex([0,1,2,3],method='ffill')
'''name	level
0	 zs	    vip1
1	 ls	    vip2
2	 ww	    pm
3	 ww	    pm
'''
df.reindex([0,1,2,3],fill_value="test")
'''name	    level
0	zs	     vip1
1	ls	     vip2
2	ww	       pm
3	test     test
'''

Series的索引和切片

【示例】索引

data=pd.Series([4,3,25,2,3],index=list('abcde'))
'''
a     4
b     3
c    25
d     2
e     3
dtype: int64
'''
data['a'] #根据key获取
# np.int64(4)
data[1] #索引获取
# np.int64(3)
data[-1] 
np.int64(3)

【示例】切片

data=pd.Series([4,3,25,2,3],index=list('abcde'))
'''
a     4
b     3
c    25
d     2
e     3
dtype: int64
'''
data['a':'d']
'''
a     4
b     3
c    25
d     2
dtype: int64
'''
data[2:4] #索引切片
'''
c    25
d     2
dtype: int64
'''
data[-3:-1]
'''
c    25
d     2
dtype: int64
'''
data[data>3]
'''
a     4
c    25
dtype: int64
'''

如果索引与行名相同都是1,这时候就不知道是按照哪个来获取,所以获取时候使用loc、iloc

  • loc函数:通过行索引 “Index” 中的具体值来取行数据及根据普通索引获取。(如取"Index"为"A"的行)
  • iloc函数:通过行号来取行数据,及根据位置索引获取。

【示例】loc与iloc的使用

data=pd.Series([5,3,2,5,9],index=[1,2,3,4,5])
'''
1    5
2    3
3    2
4    5
5    9
dtype: int64
'''
data.loc[1]
# np.int64(5)
data.iloc[1]  # 第二行的数据
# np.int64(3)

DataFrame的索引和切片

选择列

当想要获取 df 中某列数据时,只需要在 df 后面的方括号中指明要选择的列即可。如果是一列,则只需要传入一个列名;如果是同时选择多列,则传入多个列名即可(注意:多个列名 用一个 list 存放

#获取一列
df[col]
#获取多列
df[[col1 , col2]]

除了传入具体的列名,我们可以传入具体列的位置,即第几行,对数据进行选取,通过传入位置来获取数据时需要用到 iloc 方法。

df.iloc[,[0,2]]

按行列索引选择

DataFrame对象按照行列检索获取,可以使用loc和iloc函数,方括号中逗号之前的部分表示要获取的行的索引,如果输入一个冒号,或不输入任何数值表示获取所有的行或列,逗号之后方括号表示要获取的列的索引。

df.loc[普通行索引,普通列索引]
df.iloc[位置行索引,位置列索引]

【示例】loc与iloc获取

data=pd.DataFrame(np.arange(12).reshape(3,4),index=list('abc'),columns=list('ABCD'))
#获取行为'b'的行
data.loc['b']
#使用iloc获取,行为'b'的行,行号为1
data.iloc[1]
# 获取'A'列所有行
data.loc[:,'A']
data.iloc[:,0]
# 获取部分行部分列
#获取a bc行,A B列
data.loc[['a','b','c'],['A','B']]
data.iloc[[0,1,2],[0,1]]
# 【示例】获取满足条件的行
df[df[“支出”]>10]
df[(df[“支出”]>10) & (df[“性别”]=='女')]

isin()选择

df.isin(values) 返回结果为相应的位置是否匹配给出的 values

  • values 为序列:对应每个具体值
  • values 为字典:对应各个变量名称
  • values 为数据框:同时对应数值和变量名称

样例:

df.col.isin([1,3,5])
df[ df.col.isin([1,3,5])]
df[ df.col.isin(['val1','val2'])]
df[ df.index.isin(['val1','val2'])]

query()的使用

使用boolean值表达式进行筛选
df.query(
expr:语句表达式
inplace=False;是否直接替换原数据框
)
可以使用前缀“@”引用环境变量
等号为==,而不是=
样例:

df.query("col>10 and col<90 and col1=val")
limit = 5
df.query("col<=@limit & col==val")
df.query("col<=@limit & col!=val")

排序

用索引排序

df.sort_index(
level :(多重索引时)指定用于排序的级别顺序号/名称18
ascending = True :是否为升序排列,多列时以表形式提供
inplace = False :是否保留原有排序
na_position = 'last‘ :缺失值的排列顺序,first/last

样例:

df = pd.read_excel("stu_data.xlsx",index_col=["学号”,”性别”]) df.set_index( ['学号','性别'], inplace = True )
# 通过索引进行排序                              
df.sort_index()                             
df.sort_index(ascending=False)
df.sort_index(ascending = [True,False])
#设置哪个索引进行排序                          
df.sort_index(level="支出")
df.sort_index(level= ["支出","体重"])

使用变量值排序

df.sort_values(
by :指定用于排序的变量名,多列时以列表形式提供
ascending = True :是否为升序排列
inplace = False :是否保留原有排序
na_position = 'last‘ :缺失值的排列顺序,first/last

样例:

# 根据值进行排序
df.sort_values(by='身高')

计算新变量

新变量为常数

df[‘vamame’] = value

df.newvar = 1 #注意该命令不会报错!但并没有添加新变量
df.head()
df['col'] =1

基于原变量做简单四则运算

df[‘var’] = df[‘oldvar’] *100
df[‘var’] = df.oldvar * 100
样例:

df ['new_val'] = df .总分 + df .名次 + 1
# 使用内部函数计算
import math
df['n3'] = math.sqrt(9)
df['n4'] = math.sqrt(df.体重)  #报错
import numpy
df['n4'] = numpy.sqrt(df.体重)

基于一个原变量做函数运算

df.apply
func : 希望对行/列执行的函数表达式
axis = 0 :针对行还是列逬行计算
0 ’ index’:针对每列进行计算
1’ columns ':针对每行进行计算

简化的用法
df [’ varname ’ ] = df. oldvar. apply (函数表达式)

df['n5'] = df.体重.apply(math.sqrt)
df['n7'] = df.体重.apply(numpy.sqrt)
# 使用自定义函数
def get_first(tmp):return tmp[:1]
df['n6'] = df.开设.apply(get_first)

不修改原df,而是生成新的df
df.assign(varname = expression)

# 返回新的dataframe
df2 = df.assign(n8 = df.课程.apply(get_first)

在指定位置插入新变量列

df.insert(
loc :插入位置的索引值,0 <= loc <= len (columns)
column :插入的新列名称
value : Series 或者类数组结构的变量值
allow_duplicates = False :是否允许新列重名
)
该方法会直接修改原df

# 指定位置增加新列
df.insert(1,'new_col',100)
df.insert(1,'new_col2',df.课程.apply(get_first))

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

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

相关文章

基因组挖掘指导天然药物分子的发现-文献精读34

基因组挖掘指导天然药物分子的发现 摘要 天然产物是临床药物的主要来源&#xff0c;也是新药研发过程中先导化合物结构设计和优化的灵感源泉。但传统策略天然药源分子的发现却遭遇了瓶颈&#xff0c;新颖天然产物的数量逐渐无法满足现代药物开发的需求和应对全球多药耐药的威胁…

【每日刷题】Day86

【每日刷题】Day86 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 118. 杨辉三角 - 力扣&#xff08;LeetCode&#xff09; 2. 数组中出现次数超过一半的数字_牛客题霸…

Java之 jvm

jvm之管理内存 程序计数器&#xff1a;当前线程所执行的字节码的行号指示器。程序计数器是唯一一个不会出现 OutOfMemoryError 的内存区域&#xff0c;它的生命周期随着线程的创建而创建&#xff0c;随着线程的结束而死亡。Java虚拟机栈 方法调用 一个方法调用都会有对应的栈帧…

概率论三大分布

目录 基本概念 卡方分布&#xff08;χ分布&#xff09;&#xff1a; t分布&#xff1a; F分布&#xff1a; 延伸 卡方分布在哪些具体情况下最适合用于数据分析&#xff1f; t分布在大样本情况下的表现与正态分布相比如何&#xff1f; F分布在进行方差比较时与t分布的区…

加速下载,揭秘Internet Download Manager2024下载器的威力!

1. Internet Download Manager&#xff08;IDM&#xff09;是一款广受欢迎的下载管理软件&#xff0c;以其强大的下载加速功能和用户友好的界面著称。 IDM马丁正版下载如下: https://wm.makeding.com/iclk/?zoneid34275 idm最新绿色版一键安装包链接&#xff1a;抓紧保存以…

ISP 代理提供商:互联网安全的关键参与者

简介&#xff1a;互联网安全的演变态势 互联网改变了我们互动、工作和开展业务的方式&#xff0c;但也带来了与安全性和可访问性相关的重大挑战。在这个数字时代&#xff0c;互联网服务提供商 (ISP) 代理提供商在解决这些问题方面发挥着关键作用。他们提供的基本服务不仅可以增…

网络安全常见错误及解决办法(更新中)

# 开启代理&#xff0c;无法连接网络 把代理关掉 # 上一秒还在安装tree&#xff0c;下一秒xshell就连接不上了 —》sshd服务的key这个文件权限过高&#xff0c;跟装tree没有关系&#xff0c;装一个epel 源&#xff0c;epel-release​ 部分命令&#xff1a;chmod 600 /etc/ssh…

google、windows自带语音识别中英文等实时字幕使用

2、自带实时字幕 1&#xff09;google浏览器自带 实时字幕 设置里可以设置&#xff1a; 有视频声音播放会弹出黑色文本框 下载其他语言包-比如中文&#xff1a; 测试 2&#xff09;windows11 辅助功能 实时字幕 &#xff08;直接快捷键打开&#xff1a;Win Ctrl L&#…

C# 实现条件变量

C# 进程通信系列 第一章 共享内存 第二章 条件变量&#xff08;本章&#xff09; 第三章 消息队列 文章目录 C# 进程通信系列前言一、关键实现1、用到的主要对象2、初始化区分创建和打开3、变量放到共享内存4、等待和释放逻辑 二、完整代码三、使用示例1、线程同步控制2、进程…

ROS配置并同时驱动多个UVC相机(含功能包)

配置并同时驱动多个UVC相机&#xff0c;并将数据保存为ROS话题形式的bag文件。 ROS可以同时驱动多个UVC相机。要实现这个目标并将数据保存成ROS话题的形式&#xff0c;再保存为bag文件&#xff0c;可以按照以下步骤操作&#xff1a; 1. 安装必要的包 sudo apt-get update sud…

MySQL零散拾遗(四)--- 使用聚合函数时需要注意的点点滴滴

聚合函数 聚合函数作用于一组数据&#xff0c;并对一组数据返回一个值。 常见的聚合函数&#xff1a;SUM()、MAX()、MIN()、AVG()、COUNT() 对COUNT()聚合函数的更深一层理解 COUNT函数的作用&#xff1a;计算指定字段在查询结果中出现的个数&#xff08;不包含NULL值&#…

ElMessage自动引入,样式缺失和ts esline 报错问题解决

一. 环境 "unplugin-auto-import": "^0.17.6", "vue": "^3.3.8", "vite": "^5.0.0", "typescript": "^5.2.2",二. ElMessage样式缺失问题. 以下有两种解决方法 方法一: 配置了自动引用后…

TypeScript-Omit/Pick

文章目录 Omit 的词源词源分析词源历史 在 TypeScript 中的用法示例 Pick语法示例更复杂的示例使用 Pick 和其他类型组合实际应用场景 Omit vs Pick Omit 的词源 Omit 是一个英语词汇&#xff0c;它的意思是“省略”或“遗漏”。现在让我们来看看这个词的词源。 词源分析 O-…

从应答到解决:深度剖析电话客服热线系统的核心功能与价值

一、引言 在当今这个信息时代&#xff0c;客户服务的质量直接关系到企业的生存和发展。电话客服热线系统作为企业与客户之间沟通的桥梁&#xff0c;发挥着至关重要的作用。 1.电话客服热线系统的重要性 电话客服热线系统是企业与客户之间最直接、最有效的沟通渠道之一。它不…

Oracle集群RAC磁盘管理命令asmcmd的使用

文章目录 ASM磁盘共享简介ASM磁盘共享的优势ASM磁盘组成ASM磁盘共享的应用场景Asmcmd简介Asmcmd的功能Asmcmd的命令Asmcmd的使用注意事项Asmcmd运行模式交互模式运行非交互模式运行ASMCMD命令分类实例管理命令:文件管理命令:磁盘组管理命令:模板管理命令:文件访问管理命令:…

Python文献调研(一)环境搭建

一、安装Python版本 1.点击进入Python官网 Download Python | Python.org 2.根据自己的需求选择python的版本&#xff0c;点击【Download】 3.自定义安装路径&#xff0c;记得勾选Add Python xxx to PATH 这步是自动配置环境变量的&#xff0c;如果忘记勾选&#xff0c;建议…

VirtualBox 安装Centos 7 避坑指南 SSH连不上 镜像失效 静态网络配置等

背景 几乎每次安装Centos 7 时&#xff0c;都会遇到各种各样的问题&#xff0c;毕竟每次安装动辄就是半年几年&#xff0c;几乎都是在换工作时&#xff0c;有了新机器才会倒腾一次&#xff0c;时间久远&#xff0c;就会忘记一些细节&#xff0c;这次整理一下&#xff0c;避免以…

如何定位线上OOM

造成OOM的原因 1一次性申请太多对象。如&#xff1a;从数据库获取大量数据。 解决方法&#xff1a;更改申请对象的数量。如&#xff1a;做个分页。 2内存资源使用完未释放。如&#xff1a;太多线程建立数据库连接而未释放。 解决方法&#xff1a;使用线程池。 3本身资源不够…

Android笔试面试题AI答之线程Handler、Thread(2)

答案仅供参考&#xff0c;来自 讯飞星火大模型 目录 1.Android多线程间通信和多进程之间通信有什么不同&#xff0c;分别怎么实现?2.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系&#xff1f;3.Android 线程间通信有哪几种方式?4.子线程发消息…

虚拟机学习

虚拟机的优点&#xff1a; 为什么要使用虚拟机&#xff1f;VMware安装使用_研究虚拟机的意义-CSDN博客 虚拟机使用教程&#xff1a; 手把手从安装本地虚拟机&#xff0c;基于docker&#xff0c;部署springbootvue项目&#xff08;若依框架前后端分离版本演示&#xff09;&am…