【玩转pandas系列】数据清洗(文末送书福利)

news2024/11/25 22:30:40

文章目录

  • 一、重复值检测
  • 二、元素替换
    • 1️⃣ 元素替换replace
    • 2️⃣ 数据映射map
  • 三、修改索引
    • 1️⃣ 修改索引名rename
    • 2️⃣ 设置索引和重置索引
  • 四、数据处理
    • 1️⃣ apply与applymap
    • 2️⃣ transform
  • 五、异常值处理
  • 六、抽样聚合函数
    • 1️⃣ 抽样
    • 2️⃣ 数学函数
  • 七、分组聚合
  • 🎁 文末福利

本文介绍在数据分析中如何使用 pandas 进行数据清洗,是 pandas 学习阶段的 重点,没有之一。

一、重复值检测

pandas中用于重复值检测的是 duplicated() 函数,可以用于检测行或列是否前后重复,返回值是 bool 类型。True 表示重复,False 表示不重复。

函数参数:

  • keep:默认情况下 keep = first ,表示第一行不重复,后面的行参照第一行,取值还有 last(认为最后一行不重复),False(标记所有重复行)。

  • subset:只检测某些列是否重复,值是一个列表。

首先导入必要的包,并定义一个用于构建 dataframe 对象的函数:

import numpy as np
import pandas as pd
# 定义生成 dataframe 对象的函数
def make_df(indexs,columns):
    data = [[str(j)+str(i) for j in columns] for i in indexs]
    df = pd.DataFrame(data=data,index=indexs,columns=columns)
    return df
df = make_df(list('123'),list('ABC'))
df

下面演示 duplicated() 函数以及参数的使用:

# 让第一行和第二行一样
df.loc['1'] = df.loc['2']
df

df.duplicated()


等价写法:

df.duplicated(keep='first')

以最后一行为不重复参照:

df.duplicated(keep='last')


标记所有重复行:

df.duplicated(keep=False)


只检查 B、C 列:

df.duplicated(subset=['B','C'])

二、元素替换

1️⃣ 元素替换replace

replace 函数用于替换单个的元素。

首先构建 dataframe 对象:(本文后面用到的 dataframe 对象都是这个,只是数据是随机产生的,和我的肯定不同,但是不重要)

index = ['张三','张三丰','李白','杜甫']
columns = ['Python','Java','H5','UI']
data = np.random.randint(0,100,(4,4))
df = pd.DataFrame(data=data,index=index,columns=columns)
df


将1、11分别改为60,61:

df.replace({1:60,11:61})

2️⃣ 数据映射map

map 一般用于 Series 结构,不能用于 dataframe ,因此,我们在使用 map 来处理 dataframe 对象时,应该取一个 Series (列)。

如果对 dataframe 对象使用 map 函数(不是下面的第一种情况):

df.map(lambda x:'及格' if x >= 60 else '不及格')


如果对 Series 对象使用 map 函数(下面的2、3种情况):

df['Python'].map(lambda x:'及格' if x >= 60 else '不及格')

  • 1.直接使用 map

现在将上面的4、18分别改为44,81:

df.map({4:44,18:81})

在这里插入图片描述

  • 2.使用 lambda 表达式

现在使用 lambda 表达式筛选 Python 成绩,分为及格和不及格。

df['Python'].map(lambda x:'及格' if x >= 60 else '不及格')
  • 3.使用普通函数

使用普通函数,即为 map 函数传递一个函数名:

# 使用普通函数
def fn(x):
    if x >= 60:
        return '及格'
    return '不及格'
df['UI'].map(fn)

三、修改索引

1️⃣ 修改索引名rename

使用 pd.rename() 函数可以修改索引,默认是修改行索引,传递字典。

使用 rename 函数修改行索引:

df.rename({'张三':'ZhangSan'})

如果要修改列索引,要使用 axis = 1 指定:

df.rename({'Python':'派森'},axis=1)

或者使用 columns 参数:

df.rename(columns={'Java':'爪哇'})

结果如下:

修改行索引还是修改列索引,可以通过 axis 控制,也可以使用 index 、 columns 参数控制。

2️⃣ 设置索引和重置索引

pandas中 set_index() 函数用于将 keys 参数中指定的列索引变为行索引。

接下来使用 set_index() 修改列索引 Python 为行索引:

df.set_index(keys=['Python'])

函数参数:

  • keys:列表类型,用于指定要更改的列。

  • drop:bool 类型,默认为True,表示列改为行索引后,删除原来的列。

  • append:bool 列行,默认为False,表示不追加,删除原来的行索引。

重置行索引使用 reset_index 函数,重置列索引使用的是 df.columns 重新赋值。

分别重置行索引和列索引:

df.columns = ['1','2','3','4'] 
df

四、数据处理

apply、applymap、transform 都是用于数据处理的函数,其中 applymap 只适用于处理 dataframe ,apply 和 transform 适用于处理 Series 和 DataFrame 。

1️⃣ apply与applymap

apply 应用于Series:

df['Python'].apply(lambda x: True if x > 60 else False)

apply 应用于DataFrame(求每一列的平均值):

df.apply(lambda x:x.mean())


也可以传递一个函数,并控制计算行或列:

def fn(x):
    return (x.mean(),x.count())
df.apply(fn,axis=1)


applymap 处理 dataframe :

# 处理Series报错
df['Python'].applymap(lambda x:x*10)

# 处理dataframe不报错
df.applymap(lambda x:x*10)

2️⃣ transform

transform 处理 Series(计算Python列的平方根):

df['Python'].transform(np.sort)

transform 处理 DataFrame(平均值大于6就除以6):

def fn(x):
    if x.mean() > 6:
        return x / 6
    return x
df.transform(fn)

五、异常值处理

这部分的内容,主要介绍8个常用函数的用法,为了防止图片过多,部分实际运行结果已省略。

  • describe()

describe函数用于查看 dataframe 对象的列数,平均值,标准差,最小值、最大值、平均值等。

# 构建dataframe对象
data = np.random.randint(0,10,(5,3))
df = pd.DataFrame(columns=['NumPy','Pandas','Pytorch'],data=data)
df

df.describe()


查看更细致的百分位数,并且转置:

df.describe([0.01,0.33,0.99]).T

  • info()、std()

info 函数用于查看数据类型、行列索引、每一列数据非空情况、类型、内存使用情况等。
std() 函数用于求每一列的标准差。

df.info()
df.std()
  • drop()

drop 函数用于删除索引。可以通过 axis 或者 index / columns 控制删除行索引还是列索引。

df2.drop(0) # 默认删除行
df2.drop(index=0) # 等价写法
df2.drop('NumPy',axis=1) # 删除列
df2.drop(columns='NumPy') # 等价写法
df2.drop(columns=['NumPy','Pandas']) # 删除多列
df2.drop(columns='NumPy',inplace=True) # 修改原数据
  • unique()

unique 函数用于去重,只能应用于 Series 对象,不能用于 DataFrame 对象。

df['Pytorch'].unique()
  • query()

query 函数用于查询特定的行。

df.query('Pandas == 6') # 查询pandas = 6的行
df.query('Pytorch > 2') # 查询Pytorch > 2的行
df.query('Pandas == 6 and Pytorch > 2' ) # 使用 and 符
n = 3
df.query('Pytorch > @n') # 使用变量
  • sort_values()

sort_values 函数作用是根据值对行或列进行排序。

df.sort_values('Pandas') # 默认列排序
df.sort_values('Pandas',ascending=False) # 降序
df.sort_values(0,axis=1) # 行排序
  • sort_index()

sort_index 函数用于对索引排序,数字按大小,非数字按 ASCII 码。

df.sort_index() # 默认对行索引排序(axis = 0),并且是升序(ascending = True)
df.sort_index(ascending=False) # 降序
df.sort_index(axis = 1,ascending=False) # 对列索引排序,并且降序

六、抽样聚合函数

1️⃣ 抽样

pandas 中有两种抽样,分别是有放回抽样(可能重复)和无放回抽样(不会重复),使用 take 函数抽取,下面使用代码表示。

首先查看 dataframe 对象:

  • 无放回抽样
df.take([0,2,3,1,4]) # 交换行

运行结果分别是:

df.take([0,2,1],axis=1) # 交换列

在这里插入图片描述

df.take(np.random.permutation([0,1,2,3,4])) # 随机交换

  • 有放回抽样
df.take(np.random.randint(0,4,size=5))

2️⃣ 数学函数

这里罗列出了一些常用的数学函数,不再以代码演示。

函数名功能
count非空值数量
max / min最大 / 小值
median / mean中位数 / 平均数
sum
value_counts元素出现次数
cumsum累加
cumprod累乘
std标准差
var方差
cov协方差
corr相关系数

七、分组聚合

分组操作通过 groupby() 方法实现,得到的是一个 DataFrameGroupBy 对象,该对象与 DataFrame 类似,操作和 DataFrame 一样即可。

下面结合例题讲解 groupby 方法。

有如下 dataframe 对象:

df = pd.DataFrame(
    data={
        'item':['萝卜','白菜','辣椒','冬瓜','白菜','辣椒','萝卜','萝卜'],
        'color':['白色','青色','红色','白色','白色','青色','红色','青色'],
        'weight':[1,0,3,4,5,2,12,3],
        'price':[0.99,1.5,2,5,4,2,9,2]
    }
)
df

  • 1.求出颜色为白色的价格总和
# 要得到颜色为白色的所有行,首先要按照颜色进行分组,通过 by 参数指定
df.groupby(by='color')
# 接下来取出价格列(Series类型)
df.groupby(by='color')['price']
# 进行求和
df.groupby(by='color')['price'].sum()
# 最后取出白色
df.groupby(by='color')['price'].sum()['白色']
  • 2.分别求出萝卜的总重量和平均价格
# (1)
# 首先按照item分类
df.groupby('item')
# 然后取出重量
df.groupby('item')['weight']
# 求和
df.groupby('item')['weight'].sum()
# 再取出萝卜
df.groupby('item')['weight'].sum()['萝卜']
#(2)
# 类似的,得到平均价格
df.groupby('item')['price'].mean()['萝卜']
  • 3.使用 merge 合并总重量和平均价格

因为上述取出 weightprice 后是 Series 对象,我们要稍作改变为 DataFrame 对象,才能使用 merge 进行合并。

df1 = df.groupby('item')[['weight']].sum()
df2 = df.groupby('item')[['price']].mean()
display(df1,df2)


# 因为两个 df 对象没有相同列,合并时要使用 left / right_index
df1.merge(df2,left_index=True,right_index=True)

🎁 文末福利

本期送出《Python机器学习:基于PyTorch和Scikit-Learn》。

本书是一本全面介绍在PyTorch环境下学习机器学习和深度学习的综合指南,可以作为初学者的入门教程,也可以作为读者开发机器学习项目时的参考书。

本书讲解清晰、示例生动,深入介绍了机器学习方法的基础知识,不仅提供了构建机器学习模型的说明,而且提供了构建机器学习模型和解决实际问题的基本准则。本书添加了基于PyTorch的深度学习内容,介绍了新版Scikit-Learn。本书涵盖了多种用于文本和图像分类的机器学习与深度学习方法,介绍了用于生成新数据的生成对抗网络(GAN)和用于训练智能体的强化学习。最后,本书还介绍了深度学习的新动态,包括图神经网络和用于自然语言处理(NLP)的大型transformer。无论是机器学习入门新手,还是计划跟踪机器学习进展的研发人员,都可以将本书作为使用Python进行机器学习的不二之选。

学完本书,你将能够:

  • 探索机器从数据中“学习”的框架、模型和方法。

  • 使用Scikit-Learn实现机器学习,使用PyTorch实现深度学习。

  • 训练机器学习分类器分类图像、文本等数据。

  • 构建和训练神经网络、transformer及图神经网络。

  • 探索评估和优化模型的最佳方法。

  • 使用回归分析预测连续目标结果。

  • 使用情感分析深入地挖掘文本和社交媒体数据。

✳️ 点这里去往:购买链接

🎁 本次送书1~5本【阅读量越多,送的越多】

⌛️ 活动时间:截止到2023-08-8 10:00

✳️ 参与方式: 关注博主+三连(点赞、收藏、评论)(切记要点赞+收藏,否则抽奖无效)

🏆 抽奖方式: 评论区随机抽取小伙伴免费送出!!

在这里插入图片描述

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

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

相关文章

DAY16_VUE基本用法详细版

目录 0 HBuilderX修改注释0 HBuilderX 修改.VUE中的注释颜色1 Vue入门1.1 什么是Vue1.2 Vue优点1.3 Vue案例1.3.1入门案例1.3.2 v-cloak属性1.3.3.1 v-text 指令1.3.3.2 v-html 指令1.3.3.3 v-pre 指令1.3.3.4 v-once 指令1.3.3.5 v-model 指令 1.3.4 MVVM思想 1.4 事件绑定1.4…

OpenLayers入门,OpenLayers如何加载WFS服务的要素资源数据

专栏目录: OpenLayers入门教程汇总目录 前言 本章讲解如何使用OpenLayers加载WFS服务的要素资源数据。 WFS规范介绍 WFS是基于地理要素级别的数据共享和数据操作,WFS规范定义了若干基于地理要素(Feature)级别的数据操作接口,并以 HTTP 作为分布式计算平台。通过 WFS服…

如何将工作可视化管理,工作流程管理

看板利用了对视觉内容的偏好,可以帮助团队理解和分析在工作中发生了什么,遇到了哪些问题和瓶颈,我们可以通过看板更好的可视化工作流程,可以在看板内自定义工作流程, 首先创建工作流任务看板 通过Leangoo领歌敏捷看板…

AD21 PCB设计的高级应用(七)盲埋孔的设置

(七)盲埋孔的设置 1.盲埋孔的设置2.Pad/Via模板的使用 1.盲埋孔的设置 随着目前便携式产品的设计朝着小型化和高密度的方向发展,PCB的设计难度也越来越大,对 PCB 的生产工艺提出了更高的要求。在目前大部分的便携式产品中 0.65mm间距以下 BGA封装均使用…

C#+WPF上位机开发(模块化+反应式)

在上位机开发领域中,C#与C两种语言是应用最多的两种开发语言,在C语言中,与之搭配的前端框架通常以QT最为常用,而C#语言中,与之搭配的前端框架是Winform和WPF两种框架。今天我们主要讨论一下C#和WPF这一对组合在上位机开…

Android Layout大点兵

原文链接 Android Layout大点兵 智能手机催生了移动互联时代,现如今移动应用越来越成为最为核心的终端。而GUI页面是移动互联终端的标配,做好一个GUI页面,是非常重要的,能极大的提升用户体验和用户满意度。安桌生态,自…

无涯教程-jQuery - width( val )方法函数

width(val)方法设置每个匹配元素的CSS宽度。 width( val ) - 语法 selector.width( val ) 这是此方法使用的所有参数的描述- val - 这是元素的宽度。如果未指定任何显式单位(如em或%),则将" px"连接到该值。 width( val ) - 示例 以…

免费MES系统:助力企业数字化转型的利器

在这个飞速发展的数字化时代,企业的竞争力和生产效率已经与传统模式发生天翻地覆的变化。为了跟上这个变化的步伐并引领未来的生产力,下面就详细介绍免费MES系统的优势和价值。 什么是MES系统? MES系统是一种通过数字化技术实现生产计划、监…

Cocos Store 免费游戏资源下载指南!

Cocos Creator 3.8.0 新版引擎即将发布,如果你还没有使用过 Cocos Creator 引擎,本文就带你从引擎的下载、安装、到游戏源码运行,只需要3分钟搞定,Lets Go! 01 下载 Cocos Dashboard 打开浏览器,进入 Cocos Store 资源…

STM32基础回顾

文章目录 单片机编程的原理GPIO中断EXTI外部中断定时器中断、串口中断 定时器定时器中断配置过程通用定时器输出比较功能:PWM波的生成定时器的输入捕获功能主从触发模式PWMI模式 定时器的编码器接口 DMA简介通信接口USART软件配置流程:1、仅发数据的配置…

2023-07-29:华清远见嵌入式2017年线下班:文件IO笔记

这里写目录标题 华清远见嵌入式2017年线下班:文件IO笔记文件权限文件IO文件创建和打开操作文件关闭操作出错处理创建设备文件 || create || 老师自己忘了文件读操作练习:计算文件的大小?文件写操作练习:打开file1和file2&#xff…

手机设置全局代理ip步骤

在互联网时代,隐私和安全问题备受关注。使用全局代理能够帮助我们保护个人信息,突破地理限制,并提高网络速度。但是,你是否对全局代理的安全性存有疑虑?而且,如何在手机上设置全局代理呢?今天就…

探索现代前端工程化工具与流程:提升开发效率和项目质量

文章目录 引言前端工程化的背景和发展1. 构建工具的出现2. 模块化开发3. 包管理工具的兴起4. 自动化测试和持续集成5. 组件化开发和前端框架的崛起 前端工程化对项目开发和团队协作的重要性 前端工程化基础前端工程化的定义和目标前端工程化的核心概念和原则 前端工程化工具与流…

nginx 301 Moved Permanently

1.nginx配置对比 --------------------------------------------- 2.postman特殊设置(postman在301情况下,会自动进行跳转,默认为自动跳转) 关闭自动跳转后 3. nginx 301分析 nginx 301情况如下 1.当location有最后一个斜杠,且proxy_pass后不带斜杠,会自动进行301跳转到带斜杠…

cad图像中的图标变成块的办法

在cad中想要一个半球图标,但是没有找到,只能自己修改原来的球机图标,重新画好后,进行“块”话操作,也就是把画好的图标变成“块”的办法; 1.把原来的“球机”图标经过多次“x”后,分解变成“线段…

Hadoop学习指南:探索大数据时代的重要组成——HDFS(上)

HDFS HDFS概述1.1 HDFS 产出背景及定义1)HDFS产生背景2)HDFS定义 1.2 HDFS 优缺点1.3 HDFS 组成架构1.4 HDFS 文件块大小(面试重点) 2.HDFS的Shell操作(开发重点)2.1 基本语法2.2 命令大全2.3 常用命令实操…

在云服务器上,clone github时报Connection timed outexit code: 128

文章目录 问题解决方案 问题 在执行pip install安装依赖时,需要clone github代码,此时报了Connection timed out&exit code: 128错误,原因是访问超时了,此时需要使用代理 fatal: unable to access https://github.com/hugg…

认识C语言

目录 1.C语言的发展历史 2.C语言的特点 3.C语言的应用领域 1.C语言的发展历史 C语言的发展历史可以追溯到20世纪60年代。在那个时候,计算机科学领域存在着多种编程语言,但它们在功能、效率和可移植性等方面存在一些限制。 C语言的起源可以追溯到贝尔实…

Python(五十四)列表元素的删除操作

❤️ 专栏简介:本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中,我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 :本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

接口和类的区别,超通俗化解释

接口告诉你,你可以有很多赚钱方式,接着你家几代人都通过各种方式赚钱,并把所有赚钱方式都告诉了你。