一文让你快速上手Pandas(一)

简介: 一文让你快速上手Pandas

Pandas是什么

Pandas 包 是基于 Python 平台的数据管理利器,已经成为了 Python 进行数据分析和挖掘 时的数据基础平台和事实上的工业标准。 使用 Pandas 包完成数据读入、数据清理、数据准备、图表呈现等 工作,为继续学习数据建模和数据挖掘打下坚实基础。


安装

pip install pandas

Series对象创建

Series:一维数组,与Numpy中的一维array类似。它是一种类似于 一维数组的对象,是由一组数据(各种 NumPy 数据类型)以及一组与 之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的 Series 对象。用值列表生成 Series 时,Pandas 默认自动生成整数 索引 。


pandas中两个重要的属性 values 和index,values:是Series对象的 原始数据。index:对应了Series对象的索引对象




DataFrame对象创建

DataFrame 是 Pandas 中的一个表格型的数据结构,包含有一组有 序的列,每列可以是不 同的值类型(数值、字符串、布尔型等),DataFrame 即有行索引也 有列索引,可以被看做是由 Series 组成的字典。 将两个series对象作为dict的value传入,就可以创建一个 DataFrame对象。



导入Excel文件

使用read_excel()方法导入文件,首先要指定文件的路径。


说明 :使用Pandas模块操作Excel时候,需要安装openpyxl

import pandas as pd
pd.read_excel('stu_data.xlsx') 

导入.xlsx文件时,指定导入哪个Sheet

pd.read_excel('stu_data.xlsx',sheet_name='Target')
pd.read_excel('stu_data.xlsx',sheet_name=0)

导入.xlsx文件时,通过index_col指定行索引

pd.read_excel('stu_data.xlsx',sheet_name=0,index_col=0)

导入.xlsx文件时,通过header指定列索引

pd.read_excel('stu_data.xlsx',sheet_name=0,header=1)

有时候本地文件的列数太多,而我们又不需要那么多列时,我们就 可以通过设置usecols参数来指定要导入的列。

pd.read_excel('stu_data.xlsx',usecols=[1,2,3])

导入csv文件

导入csv文件时除了指明文件路径,还需要设置编码格式。Python 中用得比较多的两种编码格式是UTF-8和gbk,默认编码格式是UTF-8。我们要根据导入文件本身的编码格式进行设置,通过设置参数 encoding来设置导入的编码格式。


导入.csv文件,文件编码格式是gbk

pd.read_csv('stu_data.csv',encoding='gbk')

导入.csv文件,指明分隔符

pd.read_csv("stu_data.csv",encoding='gbk',sep=' ')
pd.read_csv('stu_data.csv',encoding='gbk',sep=',')

导入txt文件

导入.txt文件用得方法时read_table(),read_table()是将利用分隔符 分开的文件导入。DataFrame的通用函数。它不仅仅可以导入.txt 文件,还可以导入.csv文件。


导入.txt文件

pd.read_table('test_data.txt',encoding='utf8',sep='\t')

导入.csv文件,指明分隔符

pd.read_table('stu_data.csv',encoding='gbk',sep=',')

读取数据库数据

配置 MySQL 连接引擎:


conn = pymysql.connect(
host = 'localhost',
user = 'root',
passwd = 'root',
db = 'mydb',
port=3306,
charset = 'utf8' )

读取数据表:


pd.read_sql(
sql :需要执行的 SQL 语句/要读入的表名称
con : 连接引擎名称
index_col = None :将被用作索引的列名称
columns = None :当提供表名称时,需要读入的列名称
list
)
tab1 = pd.read_sql('select * from
emp',con=conn)
tab1 = pd.read_sql('select count(*) from
emp',con=conn)

保存数据

保存数据至外部文件

df.to_csv(
    filepath_or_buffer :要保存的文件路径
    sep =:分隔符
    columns :需要导出的变量列表
    header = True :指定导出数据的新变量名,可直接
提供 list
    index = True :是否导出索引
    mode = 'w' : Python 写模式,读写方式:r,r+ ,
w , w+ , a , a+     encoding = 'utf-8' :默认
导出的文件编码格式
)
df.to_excel(
     filepath_or_buffer :要读入的文件路径
     sheet_name = 1 Sheetl1 :要保存的表单名称
)

保存数据至数据库

df.to_sql(
    name :将要存储数据的表名称
    con : 连接引擎名称
    if_exists = 'fail' :指定表已经存在时的处理方
式
             fail :不做任何处理(不插入新数据)
             replace :删除原表并重建新表
             append :在原表后插入新数据
    index = True :是否导出索引 )
#pip install sqlalchemy
from sqlalchemy import create_engine
con =
create_engine('mysql+pymysql://root:root@loc
alhost:3306/mydb?charset=utf8')
df.to_sql('t_stu',con,if_exists=append)


了解数据

head()与 tail()


head()方法返回前 n 行(观察索引值),显示元素的数量默认是 5,但 可以传递自定义数值


tail()方法返回后 n 行观察索引值),显示元素的数量默认是 5,但可 以传递自定义数值


#浏览前几条记录
df.head()
df.head(10)
#浏览最后几条记录
df.tail()

info()


info()方法查看数据表中的数据类型,而且不需要一列一列的查看, info()可以输出整个表 中所有列的数据类型。


df.info()

shape


shape()方法会以元组的形式返回行、列数。注意 shape 方法获取 行数和列数时不会把索 引和列索引计算在内。


df.shape

describe()


describe()方法就是可以就可以获取所有数值类型字段的分布值。


df.describe()

列操作

修改变量列

columns


df.columns =新的名称 list

rename()

df.rename(
columns =新旧名称字典:{旧名称,:新名称,}
inplace = False :是否直接替换原数据框)
df.rename(columns =
{'newname':'name','newname2':'name2'},
inplace = True )

筛选变量列

通过 df.var 或 df[var] 可以选择单列


注意: 但只适用于已存在的列,只能筛选单列,结果为 Series


df[[var]] 单列的筛选结果为 DataFream
df[['var1', 'var2']] 多列时,列名需要用列表形式提
供(因此可使用列表中的切片操作) 多列的筛选结果为 DF

删除变量列

df.drop(
index / columns =准备删除的行/列标签,多个时用列表
形式提供
inplace = False :是否直接更改原数据框 )
df.drop(columns =['col1','col2'])
del df['column-name'] 直接删除原数据框相应的一列,
建议尽量少用
del df.column_name #不允许

添加变量列

根据新数据添加

df[cloumn] = pd.Series([val,val2,val3],index=[c1,c2,c3])

根据原数据添加

df[cloumn] = df[c2]+df[c3]

变量类型的转换

Pandas 支持的数据类型


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


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


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


在不同数据类型间转换

df.astype(
 dtype :指定希望转换的数据类型,可以使用 numpy 或
者 python 中的数据类型: int/float/bool/str
 copy = 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 ()


pd.to_string()


建立索引

新建数据框时建立索引


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


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

读入数据时建立索引


使用现有的列

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.index

修改索引


修改索引名


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

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

修改索引值


这里的修改本质上是全部替换

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

更新索引


reindex 则可以使用数据框中不存在的数值建立索引,并据此扩充 新索引值对应的索引行/ 列,同时进行缺失值填充操作。


df.reindex(labels :类数组结构的数值,将按此数值重建索引,非必需
 copy = True :建立新对象而不是直接更改原 df/series 缺失数
据的处理方式
 method :针对已经排序过的索引,确定数据单元格无数据时
的填充方法,非必需
 pad / ffill:用前面的有效数值填充
 backfill / bfill:用后面的有效数值填充
 nearest:使用最接近的数值逬行填充
 fill_value = np.NaN :将缺失值用什么数值替代
 limit = None :向前/向后填充时的最大步长
)
import pandas as pd
df = pd.DataFrame({
    'name':['zs','ls','ww'],
    'level':['vip1','vip2','pm']
})
df.reindex([0,1,3])
df.reindex([0,1,2,3],method='ffill')
df.reindex([0,1,2,3],fill_value="test")

Series的索引和切片

索引


import numpy as np
import pandas as pd
data=pd.Series([4,3,25,2,3],index=list('abcde'))
data['a'] #根据key获取
data[1] #索引获取
data[-1]

切片

import numpy as np
import pandas as pd
data=pd.Series([4,3,25,2,3],index=list('abcde'))
data['a':'d']
data[2:4] #索引切片
data[-3:-1]
data[data>3]

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


loc函数:通过行索引 "Index" 中的具体值来取行数据及根据普通索 引获取。(如取"Index"为"A"的行)


iloc函数:通过行号来取行数据,及根据位置索引获取。

data=pd.Series([5,3,2,5,9],index=[1,2,3,4,5])
data.loc[1]
data.iloc[1]

DataFrame的索引和切片

选择列


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

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

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

df.iloc[,[0,2]]

按行列索引选择


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

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

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 = [True,False])
#设置哪个索引进行排序                          
df.sort_index(level="支出")
df.sort_index(level= ["支出","体重"])

使用变量值排序


df.sort_values(
 by :指定用于排序的变量名,多列时以列表形式提供
 ascending = True :是否为升序排列
 inplace = False )
# 根据值进行排序
df.sort_values(by='身高')

计算新变量

新变量为常数

df['vamame'] = value

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

df['var'] = df['oldvar'] *100
df['var'] = df.oldvar * 100

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

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)

不修改原df,而是生成新的df


df.assign(varname = expression)


在指定位置插入新变量列

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))

修改替换变量值

本质上是如何直接指定单元格的问题,只要能准确定位单元地址, 就能够做到准确替换。


对应数值的替换

df.replace(
 to_replace = None :将被替换的原数值,所有严格匹配的数值
将被用 value 替换,可以
 str/regex/list/dict/Series/numeric/None
 value = None :希望填充的新数值
 inplace = False
)

指定数值范围的替换


方法一:使用正则表达式完成替换

df.replace(regex, newvalue)

方法二:使用行筛选方式完成替换 用行筛选方式得到行索引,然后用 loc 命令定位替换 目前也支持直接筛选出单元格进行数值替换

注意: query 命令的类 SQL 语句可以逬行检索,但不直接支持数值替换

# 使用正则匹配数据
df.开设.replace(regex = '不.+',value = '可以',inplace = True)
#iloc loc
df.支出.iloc[0:3] = 20
df.支出.loc[0:2] =30
#条件筛选替换
df.体重[df.体重>70] =70
df[df.体重==70].体重 = 80   # 注意引用问题
#query()的使用
df.query('性别 == "女" and 体重 > 60 ').体重 =50
df.loc[df.query('性别 == "女" and 体重 > 60').体重.index,'体重'] = 50
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
JSON JavaScript 前端开发
技术经验分享:ExtJS4MVC架构讲解
技术经验分享:ExtJS4MVC架构讲解
353 0
|
24天前
|
人工智能 JSON API
全网刷屏的 Jev 模型正式开放!一手实战测评 + 保姆级教程
全网爆火的 Jev 模型是什么?有什么用?怎么使用?怎么接入 AI 编程工具?效果真的好么?傻子可懂的 Jev 保姆级实战教程 + 项目实战测评来啦
9510 32
|
1天前
|
云安全 人工智能 运维
当攻击全面Agent化,你的安全防御能否跟上AI Speed?
多起客户侧AK泄露事件应急的真实观察
1160 0
|
10天前
|
存储 人工智能 并行计算
大模型本地部署终端选型方法论:以 Qwen3.8-27B 为例的四档分层完整流程
本文提出一套大模型本地部署终端选型方法论:定约束、定档位、定框架、定参数四步决策法,配合入门、主力、质量、无损四档分层模型。以 Qwen3.8-27B 实测数据为例,逐环节解读显存、带宽、存储、散热、系统、预算等要素,给出面向不同预算的优选方案、决策自查清单与市场观察框架。文末前瞻 AI 笔记本的 CPU+GPU 与统一内存两条路线,论证四步决策法在新品类上的延续性。
|
9天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型深度拆解:原理解读、实战测评与保姆级落地教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为**System One Model(系统一模型)**,对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
734 1
|
5天前
|
人工智能 JSON 自然语言处理
2026 年 Jev 决策模型全解析:核心原理拆解,性能实战测评与落地部署教程
有一款特殊AI模型在开发者圈子刷屏,它摒弃传统大模型擅长的对话聊天能力,专注做高速结构化决策,它就是TypeSafe AI推出的Jev模型。该模型由ChatGPT共同发明人Diogo Almeida主导研发,定位为System One Model(系统一模型),对标人类大脑快速直觉判断的思维模式,在响应延迟、调用成本、结构化输出稳定性上相比传统生成式大模型有着巨大差异。本文会完整拆解Jev底层原理、三大核心原语能力、适用业务场景,同时提供可直接运行的curl、Python代码示例,并且结合多组实测数据,客观分析模型优势与能力边界,帮助普通开发者和AI应用从业者快速上手落地。
488 0
|
23天前
|
人工智能 测试技术 API
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
Jev是TypeSafe AI推出的“系统一模型”,不生成文本,专做毫秒级结构化决策:Choice(多选)、Score(打分)、Noul(是非概率)。响应快193倍、成本低444倍,适合工单路由、内容审核、测试定级等高频判断场景。
2558 4
最近全网爆火的 Jev 到底是什么?适合干什么、怎么用,一篇讲透!
|
4天前
|
存储 缓存 测试技术
QWT 3D 模块重构记:旧渲染管线改进介绍及实时瀑布图示例
QWT 3D模块完成重大重构:解耦窗口与图形(Plot+Item),摒弃OpenGL 1.x固定管线,迁至Core Profile着色器渲染;支持多图元同场景叠加,并以实时3D瀑布图验证——滑动窗口、固定色域、64帧×256点达61fps。兼容Qt 5.12+/6,LGPL协议。
179 120