python—pandas基础(3)

news2025/2/24 13:33:49

文章目录

    • 虚拟变量变换
    • 数值变量分段
    • 数据分组
    • 基于拆分进行筛选
    • 分组汇总
      • 使用 agg 函数进行汇总
      • 引用自定义函数
    • 长宽格式转换
      • 长宽型格式的自由互转
    • 多个数据源的合并
    • 数据的横向合并
      • concat 命令
        • 一维的Series拼接
        • df对象拼接
        • 两个df对象拼接,按列进行拼接
        • 两个df对象拼接,如果索引重复
        • 两个df对象拼接,join参数的使用
    • 处理缺失值
      • 认识缺失值
      • 缺失值查看
      • 获取所有缺失值
      • 检查多个单元格的取值是否为指定缺值
      • 填充缺失值
      • Series对象缺失值填充
      • DataFrame对象缺失值填充
      • 列的平均值来填充
      • 删除缺失值
      • 删除空白行
    • 数据查重
      • 标识出重复的行
      • 直接删除重复的行

Pandas 是一个开源的 Python 库,提供了高性能、易用的数据结构和数据分析工具。它建立在 NumPy 之上,旨在使“关系”或“标签”数据的处理工作变得既简单又直观。Pandas 非常适合于进行数据分析、数据清洗和准备,以及数据可视化等任务。

虚拟变量变换

在这里插入图片描述
pd.get_dummies(
data :希望转换的数据框/变量列
prefix = None :哑变量名称前缀
prefix_sep = 11 :前缀和序号之间的连接字符,设定有prefix 或列名时生效
dummy_na = False :是否为 NaNs 专门设定一个哑变量列
columns = None :希望转换的原始列名,如果不设定,则转换所有符合条件的列
drop_first = False :是否返回 k-l 个哑变量,而不是 k 个哑变量
)#返回值为数据框

df2.head()
pd.get_dummies(df2.类型,prefix = '_' )
pd.get_dummies(df2 , columns= [ '类型' ])

数值变量分段

在这里插入图片描述
pd.cut(
X :希望逬行分段的变量列名称
bins :具体的分段设定
int :被等距等分的段数
sequence of scalars :具体的每一个分段起点,必须包括最值,可不等距
right = True :每段是否包括右侧界值
labels = None :为每个分段提供自定义标签
include_lowest = False :第一段是否包括最左侧界值,需要和
right 参数配合
)#分段结果是数值类型为 Categories 的序列
pd.qcut # 按均值取值范围进行等分

#按均值取值范围进行等分
df['cut1'] = pd.qcut(df.身高,q=5)
#自定义分段
df['cut2'] = pd.cut(df.身高,bins=[150,160,170,180,190],right=False)

数据分组

在这里插入图片描述
df.groupby(
by :用于分组的变量名/函数
level = None :相应的轴存在多重索引时,指定用于分组的级别
as_index = True :在结果中将组标签作为索引
sort = True :结果是否按照分组关键字逬行排序
)#生成的是分组索引标记,而不是新的 df

dfg = df.groupby ('开设')
#查看dfg里面的数据
dfg.groups
#查看具体描述
dfg.describe( )
#按多列分组
dfg2 = df.groupby(['性别','开设'])
dfg2.mean ()

基于拆分进行筛选

筛选出其中一组
dfgroup.get_group()

dfg.get_group ('不必要').mean ()
dfg.get_group ('不必要').std ()

筛选出所需的列
该操作也适用于希望对不同的变量列进行不同操作时

dfg['身高'].max()

分组汇总

在这里插入图片描述
在使用 groupby 完成数据分组后,就可以按照需求进行分组信息汇总,此时可以使用其它专门的汇总命令,如 agg 来完成汇总操作。

使用 agg 函数进行汇总

df.aggregate( )
名称可以直接简写为 agg,可以用 axis 指定汇总维度,可以直接使用的汇总函数。

名称含义
count ()Nuniber of non-null observations size () group sizes
sum()Sum of values29
mean()Mean of values
median()Arithmetic median of values
min ()Minimum
max()Maximum
std()Unbiased standard deviation
var ()Unbiased variance
skew()Unbiased skewness(3rd moment)
kurt()Unbiased kurtosis (4th moment)
quantile ()Sample quantile (value at %) apply() Generic apply
cov()Unbiased covariance (binary)
corr()Correlation (binary)
dfg.agg( 'count')
dfg.agg('median')
dfg.agg(['mean', 'median'])
dfg.agg(['mean', 'median'])
#引用非内置函数
import numpy as np
df2.身高.agg (np. sum)
dfg.身高.agg (np. sum)

引用自定义函数

# 使用自定义函数
def mynum(x:int) ->int:
   return x.min()
df2.身高.agg (mymean)
dfg.agg(mymean)

长宽格式转换

基于多重索引,Pandas 可以很容易地完成长型、宽型数据格式的相互转换。
转换为最简格式
df.stack(
level = -1 :需要处理的索引级别,默认为全部,
int/string/list
dropna = True :是否删除为缺失值的行
)#转换后的结果可能为 Series

df =pd.read_excel('person.xlsx')
dfs = df.stack()

长宽型格式的自由互转

df.unstack(
level = -1 :需要处理的索引级别,默认为全部,
int/string/list
fill_value :用于填充缺失值的数值
)

dfs.unstack (1)
dfs.unstack([0,1])

数据转置: df.T

多个数据源的合并

在这里插入图片描述
df.append(
other :希望添加的 DF/Series/字典/上述对象的列表使用列表方式,就可以实现一次合并多个新对象
ignore_index = False :添加时是否忽略索引
verify_integrity = False :是否检查索引值的唯一性,有重复时报错
)

df = df.append( [df2, df3, df4])
def make_df(cols,index):
   data={c:[str(c)+str(i) for i in index]
for c in cols}
   return pd.DataFrame(data,index=index)
df1=make_df('AB',[1,2])
df2=make_df('AB',[3,4])
#append合并
df1.append(df2)
#多个df对象合并
df3 = make_df('AB',[5,6])
df1.append([df2,df3])
#ignore_index
df1=make_df('AB',[1,2])
df2=make_df('AB',[1,2])
df1.append(df2)
df1.append(df2,ignore_index=True)

数据的横向合并

在这里插入图片描述
merge 命令使用像 SQL 的连接方式
pd.merge(
需要合并的 DF
left :需要合并的左侧 DF
right :需要合并的右侧 DF
how = ’ inner’:具体的连接类型
{left、right 、outer 、 inner、)
两个 DF 的连接方式
on :用于连接两个 DF 的关键变量(多个时为列表),必须在
两侧都出现
left_on :左侧 DF 用于连接的关键变量(多个时为列表)
right_on :右侧 DF 用于连接的关键变量(多个时为列表)
left_index = False :是否将左侧 DF 的索引用于连接
right_index = False :是否将右侧 DF 的索引用于连接
)

left=pd.DataFrame({'key':['k0','k1','k2','k3'],'A':['A0','A1','A2','A3'],'B'['B0','B1','B2','B3'],})
right=pd.DataFrame({'key':['k0','k1','k2','k3'],'C':['C0','C1','C2','C3'],'D'['D0','D1','D2','D3'],})
result=pd.merge(left,right)
#how参数的使用
left=pd.DataFrame({'key':['k0','k1','k2','k3'],'A':['A0','A1','A2','A3'],'B'['B0','B1','B2','B3'],})
right=pd.DataFrame({'key':['k0','k1','k2','k4'],'C':['C0','C1','C2','C3'],'D'['D0','D1','D2','D3'],})
result=pd.merge(left,right,how='left')
#left_on  right_on
left=pd.DataFrame({'key1':['k0','k1','k2','k3'],'A':['A0','A1','A2','A3'],'B'['B0','B1','B2','B3'],})
right=pd.DataFrame({'key2':['k0','k1','k2','k4'],'C':['C0','C1','C2','C3'],'D'['D0','D1','D2','D3'],})
result=pd.merge(left,right,how='left',left_on='key1',right_on='key2')
#left_index right_index
left = left.set_index(keys='key1')
right = right.set_index(keys='key2')
pd.merge(left,right,left_index=True,right_index=True)

concat 命令

同时支持横向合并与纵向合并
pd.concat(
axis = 0 :对行还是对列方向逬行合并(0 index 、 1 columns )
join = outer :对另一个轴向的索引值如何逬行处理(inner 、outer )
ignore_index = False
keys = None :为不同数据源的提供合并后的索引值
verify_integrity = False 是否检查索引值的唯一性,有重复时报错
copy = True
)

一维的Series拼接
ser1=pd.Series([1,2,3],index=list('ABC'))
ser2=pd.Series([4,5,6],index=list('DEF'))
pd.concat([ser1,ser2])
df对象拼接
def make_df(cols,index):
   data={c:[str(c)+str(i) for i in index]
for c in cols}
   return pd.DataFrame(data,index=index)
df1=make_df('AB',[1,2])
df2=make_df('AB',[3,4])
pd.concat([df1,df2])
两个df对象拼接,按列进行拼接
df1=make_df('AB',[1,2])
df2=make_df('AB',[3,4])
pd.concat([df1,df2],axis=1)
#或者
pd.concat([df1,df2],axis='columns')
两个df对象拼接,如果索引重复
x=make_df('AB',[1,2])
y=make_df('AB',[1,2])
pd.concat([x,y])
#解决索引重复问题加ignore_index属性
pd.concat([x,y],ignore_index=True)
#解决索引重复问题,加keys属性
pd.concat([x,y],keys=list('xy'))
两个df对象拼接,join参数的使用
a=make_df('ABC',[1,2])
b=make_df('BCD',[3,4])
pd.concat([a,b],join='inner')
a=make_df('ABC',[1,2,3,4])
b=make_df('BCD',[3,4,5])
pd.concat([a,b],join='outer',axis=1)

处理缺失值

在这里插入图片描述

认识缺失值

系统默认的缺失值 None 和 np. nan

data=pd.Series([3,4,np.nan,1,5,None])
df=pd.DataFrame([[1,2,None],[4,np.nan,6],[5,6,7]])

缺失值查看

直接调用info()方法就会返回每一列的缺失情况

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
df.info()

Pandas中缺失值用NaN表示,从用info()方法的结果来看,索引1这一列是1 2 non-null float64,表示这一列有2个非空值,而应该是3个非空值,说明这一列有1个空值。还可以用isnull()方法来判断哪个值是缺失值,如果是缺失值则返回True,如果不是缺失值返回False。df.isna(): 检查相应的数据是否为缺失值 同 df.isnull()。df.notna()等同于notnull().

获取所有缺失值

data=pd.Series([3,4,np.nan,1,5,None])
print('isnull()方法判断是否是缺值:')
print(data.isnull())
print(data.isna())
print('获取缺值:')
print(data[data.isnull()])
print('获取非空值')
print(data[data.notnull()])

检查多个单元格的取值是否为指定缺值

df.any(
axis : index (0), columns (1)
skipna = True :检查时是否忽略缺失值
level = None :多重索引时指定具体的级别
)
df.all(
axis : index (0), columns (1)
skipna = True :检查时是否忽略缺失值
level = None :多重索引时指定具体的级别

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
df.info()
#默认检测的是列值
df.isna().any()
#检测行值
df.isna().any(1)
df[df.isna().any(1)]

填充缺失值

调用fillna()方法对数据表中的所有缺失值进行填充,在fillna()方法中输入要填充的值。还可以通过method参数使用前一个数和后一个数来进行填充。
df.fillna(
value :用于填充缺失值的数值,也可以提供
dict/Series/DataFrame 以进—步指明哪些索引/列会被替换 不能使用 list
method = None :有索引时具体的填充方法,向前填充,向后填充等
limit = None :指定了 method 后设定具体的最大填充步长,此步长不能填充
axis : index (0), columns (1)
inplace = False
)

Series对象缺失值填充

data=pd.Series([3,4,np.nan,1,5,None])
print('以0进行填充:')
print(data.fillna(0))
print('以前一个数进行填充:')
print(data.fillna(method='ffill'))
print('以后一个数进行填充:')
print(data.fillna(method='bfill'))
print('先按前一个,再按后一个')
print(data.fillna(method='bfill').fillna(method='ffill'))

DataFrame对象缺失值填充

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
print('使用数值0来填充:')
print(df.fillna(0))
print('使用行的前一个数来填充:')
print(df.fillna(method='ffill'))
print('使用列的后一个数来填充:')
print(df.fillna(method='bfill' ,axis=1))

列的平均值来填充

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
for i in df.columns:
   df[i]=df[i].fillna(np.nanmean(df[i]))
df

删除缺失值

调用dropna()方法删除缺失值,dropna()方法默认删除含有缺失值的行,也就是只要某一行有缺失值就把这一行删除。如果想按列为单位删除缺失值,需要传入参数axis=’columns’。
df.dropna(
axis = 0 : index (0), columns (1)
how = any : any、all
any :任何一个为 NA 就删除
all :所有的都是 NA 删除
thresh = None :删除的数量阈值,
int
subset :希望在处理中包括的行/列子集
inplace = False :
)

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
print('默认为以行为单位剔除:')
print(df.dropna())
print('以列为单位剔除:')
df.dropna(axis='columns')

删除空白行

df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]])
print('所有为nan时候才剔除:')
print(df.dropna(how='all'))
print('默认情况,只要有就剔除')
print(df.dropna(how='any'))

数据查重

在这里插入图片描述

标识出重复的行

标识出重复行的意义在于进一步检査重复原因,以便将可能的错误数据加以修改

df['dup' ] = df.duplicated( ['课程','开设'])
#利用索引进行重复行标识 df.index.duplicated()
df2 = df.set_index ( ['课程','开设'] )
df2.index.duplicated ()

直接删除重复的行

drop_duplicates (
subset=“ ”按照指定的行逬行去重
keep=‘first’ 、 ‘last’ 、 False 是否直接删除有重复的所有记录
)

df. drop_duplicates ( ['课程', '开设' ] )
df. drop_duplicates ( ['课程', '开设' ] , keep= False )

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

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

相关文章

55事务、批处理、CBLOB

day55 事务 MySQL:每一条语句都属于独立事务,默认自动管理提交的。 如果需要把多条语句当成一个整体,那么就需要把多条语句放在一个事务里面 开启事务:start transaction 提交事务:commit; 回滚事务:rollback 封装事务…

【安装笔记-20240727-Windows-OpenWrt 23.05 docker 安装 wordpress】

安装笔记-系列文章目录 安装笔记-20240727-Windows-OpenWrt 23.05 docker 安装 wordpress 文章目录 安装笔记-系列文章目录安装笔记-20240727-Windows-OpenWrt 23.05 docker 安装 wordpress 前言一、调试环境操作系统:Windows 10 专业版调试环境 二、安装步骤测试版…

基于SpringBoot的商业航班执飞飞机机型信息管理

目录 前言 一、数据库模型的设计与实现 1、表结构设计 2、数据去重和消歧 二、后台应用程序设计 1、实体类设计 2、业务层及控制层设计与实现 3、视图层的实现 三、系统成果展示 1、飞机机型管理列表 2、机型信息编辑 四、总结 前言 在之前的信息中,我们对…

流媒体服务器二:RTMP协议详解 以及 RTMP学习到什么程度算是合格?

一个问题? 在上一节我们使用SRS搭建了RTMP环境,那么在企业开发中,是否使用第三方的RTMP服务器(例如上一节的SRS)就可以了呢?或者说:作为一个音视频开发人员,就会配置就OK了呢&#…

windows USB 设备驱动开发-创建安装 Winusb.sys 的驱动程序包

要将 WinUSB 用作设备的功能驱动程序,请创建一个驱动程序包。 驱动程序包必须包含以下文件: WinUSB 辅助安装程序 (Winusbcoinstaller.dll);KMDF 辅助安装程序 (WdfcoinstallerXXX.dll);一个 .inf 文件,用于将 Winusb…

MYSQL 第三次作业

1、第三次作业 01、SELECT * FROM student; SELECT * FROM score; 02、SELECT * FROM student LIMIT 1, 3; 03、SELECT * FROM student WHERE department IN (计算机系, 英语系); 04、SELECT * FROM student WHERE birth_year > 1998; 05、SELECT department, COUNT(*) as c…

Corel VideoStudio 会声会影2023旗舰版视频软件

使用新版 Corel VideoStudio 会声会影2023是 一次激活永久使用。 享受有趣轻松的视频编辑体验。通过数百种滤镜、效果、标题、过渡和图形 — 包括新增面部追踪贴纸 — 探索拖放创意。运用直观的工具和即时项目模板,几分钟即可创建出色的视频!探索有趣简单…

【JUC】CAS(轻量级加锁)

文章目录 原子类没有CAS之前使用CAS之后CAS是什么?compareAndSet 源码 CAS底层原理?谈谈对Unsafe类的理解?Unsafei是线程不安全的,AtomicInteger.getAndIncrement()如何保证原子性? 源码分析底层汇编语言面试回答 原子…

OriginPro 2024b (学习版) 绘制3D坐标下 边际直方图

OriginPro 2024b (学习版) 绘制3D坐标下 边际直方图 时间 2024年7月27日 1.导入数据 需要3列数据,分别作为x,y,z, 其中z值随便设置。快速设置z值的方法:在第4行“F(x)”输入1,这一列的值全设置为1了。 设置x,y,z的方法如下:点击…

【机器学习】周志华《机器学习》西瓜书勘误:按章节排序整理(截至2024年1月第45次印刷)

文章目录 按章节排序第 1 章 绪论第 2 章 模型评估与选择第 3 章 线性模型第 4 章 决策树第 5 章 神经网络第 6 章 支持向量机第 7 章 贝叶斯分类器第 8 章 集成学习第 9 章 聚类第10章 降维与度量学习第11章 特征选择与稀疏学习第12章 计算学习理论第13章 半监督学习第14章 概…

使用两台虚拟机分别部署前端和后端项目

使用两台虚拟机分别部署前端和后端项目 1 部署方案2 准备两台虚拟机,并配置网络环境3 部署后端项目3.1 打包服务3.2 上传jar包到服务器3.3 集成Systemd3.3.1 移动端服务集成Systemd3.3.2 后台管理系统集成Systemd 4 配置域名映射5 部署前端项目5.1 移动端5.1.1 打包…

JVM系列(二) -类的加载过程

一、背景介绍 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件,然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。 那么虚拟机是什么时候加载class文件?如何加载class文件?class文件进入到虚拟机后发…

ARCH和GARCH模型★★

该博客为个人学习清风建模的学习笔记,部分课程可以在B站:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 该节是针对时间序列分析中对证券指数分析不能使用传统时间序列模型做出的模型&a…

C++ 基础(类和对象下)

目录 一. 再探构造函数 1.1. 初始化列表(尽量使用列表初始化) 二. static成员 2.1static成员初始化 三.友元 3.1友元:提供了⼀种 突破类访问限定符封装的方式. 四.内部类 4.1如果⼀个类定义在另⼀个类的内部,这个内部类就叫…

数据结构第三讲:单链表的实现

数据结构第三讲:单链表的实现 1.什么是单链表2. 节点3.单链表的实现3.1节点的结构3.2打印单链表3.3申请一个新节点3.4单链表尾部插入3.5单链表头部插入3.6单链表的尾部删除3.7单链表头部删除3.8查找3.9在指定位置之前插入数据3.10在指定位置之后插入数据3.11删除pos…

全国区块链职业技能大赛样题第9套前端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 登录 ​ 用户管理

Java httpclient请求form-data格式,并设置boundary代码实现

文章目录 form-data 数据请求格式样例报错信息: **MissingServletRequestParameterException**解决方法报错信息: **no multipart boundary was found** 解决方法Java代码实现【错误】使用 UrlEncodedFormEntity 、BasicNameValuePair 请求失败(error)【…

【计算机毕业设计】850汽车售后服务信息管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

《Windows API每日一练》20.1 动态链接库

本节将介绍如何编写动态链接库,并更全面地探讨动态链接库的使用方法,包括以不同的方法装入动态链接库和以不同的方法调用其中的函数等。 本节必须掌握的知识点: 动态链接库的概念 第157练:编写动态链接库DLL 第158练:…

Java从入门到精通(十二)~ 动态代理

晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。 文章目录 目录 前言 主要作用和功能: 应用场景: 二、代理概念 1.静态代理 2.动态代理 2.1 概念介绍 …