【Pandas操作2】groupby函数、pivot_table函数、数据运算(map和apply)、重复值清洗、异常值清洗、缺失值处理

news2024/11/16 21:27:51

1 数据清洗

#### 概述

数据清洗是指对原始数据进行处理和转换,以去除无效、重复、缺失或错误的数据,使数据符合分析的要求。

#### 作用和意义

- 提高数据质量:
  - 通过数据清洗,数据质量得到提升,减少错误分析和错误决策。
- 增加数据可用性:
  - 清洗后的数据更加规整和易于使用,提高数据的可用性和可读性。


## 清洗维度

- 缺失值处理:
  - 对于缺失的数据,可以删除包含缺失值的行或列或者填充缺失值。
- 重复值处理:
  - 识别和删除重复的数据行,避免重复数据对分析结果产生误导。
- 异常值处理:
  - 检测和处理异常值,决定是删除、替换或保留异常值。

## 缺失值清洗

##### 缺失值/空值的删除

- 伪造缺失值数据
import pandas as pd
from pandas import DataFrame, Series

df = pd.read_csv('./data/none.csv', index_col=0)
df  # NaN就是None空白

在这里插入图片描述

  • 缺失值的检测和删除,相关方法:
    • isnull():检测df中的每一个元素是否为空值,为空则给该元素返回True,否则返回False
    • notnull():检测df中的每一个元素是否为非空值,为非空则给该元素返回True,否则返回False
    • any():检测一行或一列布尔值中是否存在一个或多个True,有则返回True,否则返回False
    • all():检测一行或一列布尔值中是否存全部为True,有则返回True,否则返回False
    • dropna():将存在缺失值/空值的行或者列进行删除
# 检测哪些列中存在控制
df.isnull()

在这里插入图片描述

# 检测非空值
df.notnull()

在这里插入图片描述

# 可以判断哪些列存在控制
# axis=0表示针对列进行any操作
# axis=1表示针对行进行any操作
df.isnull().any(axis=0)

在这里插入图片描述

df.notnull().all(axis=0)

在这里插入图片描述

  • dropna()进行空值检测和过滤
# 直接返回删除空值对应后的结果,不会直接改变原始数据
df.dropna()

在这里插入图片描述

  • 计算df中每一列存在缺失值的个数和占比
for col in df.columns:
    # 满足该条件则表示第col列中存在空值
    if df[col].isnull().sum() > 0:
        # 求出该列空值的个数
        null_count = df[col].isnull().sum()
        # 求出该列中空值的占比:  空值的数量/列的总元素个数
        p = format(null_count / df[col].size, '.2%')
        print(col, null_count, p)

在这里插入图片描述

  • 使用任意值填充空值
# 如果想应用于原始数据,就加上inplace=True
df.fillna(value=666)

在这里插入图片描述

  • 使用近邻值填充空值
# 在竖直方向上,会用空值前面的值填充空值  ffill前值填充 
df.fillna(axis=0, method='ffill').fillna(axis=0, method='bfill')  # bfill后值填充

在这里插入图片描述

  • 使用相关的统计值填充空值
# 可以空值列的均值、中位数、方差等统计指标对空值进行填充
for col in df.columns:
    if df[col].isnull().sum() > 0:
        # 计算出空值对应的均值
        mean_value = df[col].mean()
        df[col].fillna(value=mean_value, inplace=True)
df

在这里插入图片描述
注意:实现空值的清洗最好选择删除的方式,如果删除的成本比较高,再选择填充的方式。

2 重复值清洗

  • 伪造重复行的数据源
df = pd.read_csv('data/repeat.csv', index_col=0)
df

在这里插入图片描述

  • 使用duplicated()方法检测重复的行数据
df.duplicated().sum() # 2
  • 使用drop_duplicates()方法检测且删除重复的行数据
df.drop_duplicates()

在这里插入图片描述

3 异常值清洗

异常值是分析师和数据科学家常用的术语,因为它需要密切注意,否则可能导致错误的估计。
简单来说,异常值是一个观察值,远远超出了样本中的整体模式。

异常值在统计学上的全称是疑似异常值,也称作离群点,异常值的分析也称作离群点分析。
异常值是指样本中出现的“极端值”,数据值看起来异常大或异常小,其分布明显偏离其余的观测值。
异常值分析是检验数据中是否存在不合常理的数据。

  • 给定条件的异常数据处理
    • 自定义一个1000行3列(A,B,C)取值范围为0-1的数据源,然后将C列中的值大于其两倍标准差的异常值进行清洗
data = pd.read_csv('./data/outlier.csv', index_col=0)
data

在这里插入图片描述

# C列的2倍标准差
twice_std = data['C'].std() * 2
twice_std
# 判定异常值, 即值大于2倍的标准差
ex = data['C'] > twice_std
ex  # True表示异常值,False标志正常值

在这里插入图片描述

# 取出True对应的行数据 (异常值对应的行数据)
data.loc[ex]

在这里插入图片描述

# 提取异常值对应行数据的行索引
drop_index = data.loc[ex].index
drop_index

在这里插入图片描述

# 将异常值对应的行从数据表格中进行删除
data.drop(index=drop_index)

在这里插入图片描述

3 map映射

  • 给Series中的一组数据提供另外一种表现形式,或者说给其绑定一组指定的标签或字符串。
  • 创建一个df,两列分别是姓名和薪资,然后给其名字起对应的英文名,然后将英文的性别统一转换为中文的性别
dic = {
    'name': ['tom', 'jerry', 'alex', 'tom'],
    'salary': [10000, 20000, 15000, 21000],
    'gender': ['male', 'female', 'male', 'female']
}
df = pd.DataFrame(data=dic)
df

在这里插入图片描述

# 将性别使用中文来标志
sex_dic = {
     'male':'男',
     'female':'女'
}

# map可以根据gender这组数据中的每一个元素根据字典表示的关系进行映射
df['gender'] = df['gender'].map(sex_dic)
df

在这里插入图片描述

# 给每一个英文名起一个中文名
name_dic = {
    'tom': '张三',
    'jerry': '李四',
    'alex': '王五'
}
df['e_name'] = df['name'].map(name_dic)
df

在这里插入图片描述

4 数据运算

map函数对Series数据的运算处理(map作为Series的运算工具)

  • 超过3000部分的钱缴纳50%的税,计算每个人的税后薪资
def after_sal(s):  # 此处s参数表示每一个薪资的数据
    # 该函数的调用次数取决于salary列中元素的个数
    return s - (s - 3000) * 0.5
    

df['after_sal'] = df['salary'].map(after_sal)
df

在这里插入图片描述

# 改为匿名函数
df['salary'].map(lambda s: s - (s - 3000) * 0.5)

在这里插入图片描述

dic = {
    'name': ['tom', 'jerry', 'alex', 'tom'],
    'salary': [10000, 20000, 15000, 21000],
    'gender': ['male', 'female', 'male', 'female'],
    'hire_date': ['2020-01-10', '2021-11-11', '2022-12-12','2023-01-19',]
}
df = pd.DataFrame(data=dic)
df

在这里插入图片描述

# 将每一个员工的入职日期 +2 年
# 将 'hire_date' 转换为日期格式并加上2年
df['hire_date'] = pd.to_datetime(df['hire_date'])
df['hire_date_now'] = df['hire_date'].map(lambda x: x + pd.DateOffset(years=2))
df

在这里插入图片描述

dic = {
    'name': ['tom', 'jerry', 'alex', 'tom'],
    'salary': [10000, 20000, 15000, 21000],
    'gender': ['male', 'female', 'male', 'female'],
    'hire_date': ['2020-01-10', '2021-11-11', '2022-12-12','2023-01-19',]
}
df = pd.DataFrame(data=dic)

# 也可以使用函数
# 将每一个员工的入职日期 +2 年
def func(x):
    year, month, day = x.split('-')
    year = int(year) + 2
    return str(year)+'-'+month+'-'+day
df['hire_date'] = df['hire_date'].map(func)
df

在这里插入图片描述
提示:apply也可以像map一样充当运算工具,不过apply运算效率要远远高于map。
因此在数据量级较大的时候可以使用apply。

dic = {
    'name': ['tom', 'jerry', 'alex', 'tom'],
    'salary': [10000, 20000, 15000, 21000],
    'gender': ['male', 'female', 'male', 'female'],
    'hire_date': ['2020-01-10', '2021-11-11', '2022-12-12','2023-01-19',]
}
df = pd.DataFrame(data=dic)


def func(x):
    year, month, day = x.split('-')
    year = int(year) + 2
    return str(year)+'-'+month+'-'+day
df['hire_date'] = df['hire_date'].apply(func)
df

在这里插入图片描述

5 数据分组

  • 数据分类处理的核心:
    • groupby()函数
    • groups属性查看分组情况
import pandas as pd
import warnings

warnings.filterwarnings('ignore')

df = pd.DataFrame({
    'item':['Apple','Banana','0range','Banana','0range','Apple'],
    'price':[4, 3, 3, 2.5, 4, 2],
    'color':['red','yellow','yellow','green','green','green'],
    'weight':[12,20,50,30,20,44]
})
df

在这里插入图片描述

# 计算每种水果的平均价格
df.groupby(by='item').groups  # groups查看分组的结果

在这里插入图片描述

mean_price = df.groupby(by='item')['price'].mean()
mean_price

在这里插入图片描述

# 将平均价格转为字典
dic = mean_price.to_dict()
dic

在这里插入图片描述

# 将水果的平均价格汇总到原始的数据中
df['mean_price'] = df['item'].map(dic)
df

在这里插入图片描述

# 计算不同颜色水果的最大重量
max_weight = df.groupby(by='color')['weight'].max()

max_weight

在这里插入图片描述

dic = max_weight.to_dict()
df['color'].map(dic)

在这里插入图片描述

# 将不同水果的最大重量汇总到原始的数据中
df['max_weight'] = df['color'].map(dic)
df

在这里插入图片描述

# 计算每种水果最大价格和最低价格的差值
def func(x):  # 参数x:一组水果的所有价格
    return x.max() - x.min()
    
df.groupby(by='item')['price'].transform(func)

在这里插入图片描述

  • agg实现对分组后的结果进行多种不同形式的聚合操作
# 求每种水果的最大和最小价格
df.groupby(by='item')['price'].agg(['max', 'min', 'mean', 'sum'])

在这里插入图片描述

6 透视表pivot_table函数

  • 对不同字段不同形式的聚合操作
# 计算每种水果的平均价格
# 参数index:表示分组的条件
# 参数values:表示对哪些字段进行聚合操作
# 参数aggfunc:用户指定聚合形式
df.pivot_table(index='item', values='price', aggfunc='mean')

在这里插入图片描述

# 计算不同颜色水果的最大、最小和平均重量
df.pivot_table(index='color', aggfunc={'weight': 'max', 'weight': 'min', 'weight': 'mean',})

在这里插入图片描述

# 计算不同颜色水果的最大、最小和平均重量
df.pivot_table(index='color', values='weight', aggfunc=['max', 'min', 'mean'])

在这里插入图片描述

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

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

相关文章

sharding-jdbc metadata load优化(4.1.1版本)

背景 系统启动时,会注意sharding-jdbc提示加载metadata 于是想看看里面做了什么事情 问题追踪 debug后可以观察走到了该类 org.apache.shardingsphere.shardingjdbc.jdbc.core.context.ShardingRuntimeContext#loadSchemaMetaData 先看这个shardingRuntimeConte…

玉米种子质量检测系统源码分享

玉米种子质量检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

数据结构——栈和队列(队列的定义、顺序队列以及链式队列的基本操作)

目录 队列(queue)的定义 顺序队——队列的顺序表示和实现 顺序队列(循环队列)的类型定义 顺序队列上溢问题的解决方法 ​编辑 循环队列的基本操作 队列的基本操作——队列的初始化 队列的基本操作——求队列的长度 队列的…

[数据集][目标检测]岩石种类检测数据集VOC+YOLO格式4766张9类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4766 标注数量(xml文件个数):4766 标注数量(txt文件个数):4766 标注…

CurrentHashMap的底层原理

CurrentHashMap在jdk1.8之前使用的是分段锁,在jdk1.8中使用"CAS和synchronized"来保证线程安全。 jdk1.8之前的底层实现 CurrentHashMap在jdk1.8之前,通过Segment段来实现线程安全。 Segment 段 ConcurrentHashMap 和 HashMap 思路是差不多…

TDengine 签约前晨汽车,解锁智能出行的无限潜力

在全球汽车产业转型升级的背景下,智能网联和新能源技术正迅速成为商用车行业的重要发展方向。随着市场对环保和智能化需求的日益增强,企业必须在技术创新和数据管理上不断突破,以满足客户对高效、安全和智能出行的期待。在这一背景下&#xf…

如何通过 PhantomJS 模拟用户行为抓取动态网页内容

引言 随着网页技术的不断进步,JavaScript 动态加载内容已成为网站设计的新常态,这对传统的静态网页抓取方法提出了挑战。为了应对这一挑战,PhantomJS 作为一个无头浏览器,能够模拟用户行为并执行 JavaScript,成为了获…

探索数据结构:初入算法之经典排序算法

🔑🔑博客主页:阿客不是客 🍓🍓系列专栏:渐入佳境之数据结构与算法 欢迎来到泊舟小课堂 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 一、插入排序 步骤: 从第一个元素开…

OpenAI 刚刚推出 o1 大模型!!突破LLM极限

北京时间 9 月 13 日午夜,OpenAI 正式发布了一系列全新的 AI 大模型,专门用于应对复杂问题。 这一新模型的出现代表了一个重要突破,其具备的复杂推理能力远远超过了以往用于科学、代码和数学等领域的通用模型,能够解决比之前更难的…

Python和R均方根误差平均绝对误差算法模型

🎯要点 回归模型误差评估指标归一化均方根误差生态状态指标神经网络成本误差计算气体排放气候算法模型 Python误差指标 均方根误差和平均绝对误差 均方根偏差或均方根误差是两个密切相关且经常使用的度量值之一,用于衡量真实值或预测值与观测值或估…

HarmonyOS开发实战( Beta5.0)骨架屏实现案例实践

鸿蒙HarmonyOS开发往期必看: HarmonyOS NEXT应用开发性能实践总结 最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) 介绍 本示例介绍通过骨架屏提升加载时用户体验的方法。骨架屏用…

无法加载用户配置文件怎么解决?

你有没有遇到过这种问题,蓝屏提示“User Profile Services服务登录失败。无法加载用户配置文件”。为什么会出现问题呢?可能的原因包括: 用户配置文件损坏:用户的配置文件可能已损坏,导致系统无法读取。 权限问题&…

linux更换阿里镜像源

第一步:进入 /etc/yum.repos.d目录下 cd /etc/yum.repos.d 第二步:编辑 CentOS-Base.repo 打开该文件 vi CentOS-Base.repo 第三步:点击键盘i,进入编辑模式 删除文件的全部内容:将阿里下面配置复制粘贴进取 [base] nam…

Ribbon (WPF)

Ribbon (WPF) 在本文中主要包含以下内容: Ribbon组件和功能应用程序菜单快速访问工具栏增强的工具提示 Ribbon是一个命令栏,它将应用程序的功能组织到应用程序窗口顶部的一系列选项卡中。Ribbon用户界面(UI)增加了特性和功能的可发现性,使用…

神经网络学习笔记——如何设计、实现并训练一个标准的前馈神经网络

1.从零设计并训练一个神经网络https://www.bilibili.com/video/BV134421U77t/?spm_id_from333.337.search-card.all.click&vd_source0b1f472915ac9cb9cdccb8658d6c2e69 一、如何设计、实现并训练一个标准的前馈神经网络,用于手写数字图像的分类,重…

如何制作Vector Vflash中加载的DLL文件--自动解锁刷写过程中27服务

案例背景: vFlash 是一种易于使用的工具,用于对一个或多个 ECU 进行刷写软件。由于方法灵活,它可以支持各种汽车原始设备制造商的不同刷写规范。它支持通过 CAN、CAN FD、FlexRay、LIN、以太网/DoIP 和以太网/SoAd 对 ECU 进行刷写。 vFlas…

SpringSecurity原理解析(六):SecurityConfigurer 解析

1、SecurityConfigurer SecurityConfigurer 在 Spring Security 中是一个非常重要的接口,观察HttpSecurity 中的很多 方法可以发现,SpringSecurity 中的每一个过滤器都是通过 xxxConfigurer 来进行配置的,而 这些 xxxConfigurer 其实都是 Sec…

针对Docker容器的可视化管理工具—DockerUI

目录 ⛳️推荐 前言 1. 安装部署DockerUI 2. 安装cpolar内网穿透 3. 配置DockerUI公网访问地址 4. 公网远程访问DockerUI 5. 固定DockerUI公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

GBI(生成式商业智能)实际业务生产落地运用上的探索和实践

前言 最近在探索如何发展AI在业务上的驱动力时了解到了生成式商业智能这一概念,同时本人也在探索ChatBI这一技术的实际落地运用,其实二者几乎在实现效果层面是一个意思,GBI(Generative Business Intelligence)是偏向业务方面,而C…

[000-01-008].第05节:OpenFeign高级特性-超时控制

我的后端学习大纲 SpringCloud学习大纲 1.1.OpenFeign超时的情况: 在Spring Cloud微服务架构中,大部分公司都是利用OpenFeign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂&#xff…