数据分析08——Pandas中对数据进行数据清洗

2023-11-08

0、前言:

  • 使用pandas修改数据是否会改变源数据?
    • Pandas 对 DataFrame 的操作通常是针对原始数据本身而不是其副本的。例如,当我们使用 .loc 或 .iloc 方法选择 DataFrame 中的某行或某列并进行修改时,实际上是直接更改了原始数据,而不是创建了一个副本进行修改。

    • 为了避免修改源数据,我们可以采取以下两种方法:

      • 使用 copy() 方法,生成原 DataFrame 的副本,并对副本进行操作,这样就不会对原 DataFrame 产生影响。

      • 使用 Pandas 提供的 inplace 参数来指定是否在原 DataFrame 上进行操作。例如,在对某个 DataFrame 做操作时,可以加上 inplace=True 的参数选项(如:df.drop(‘c’, axis=1, inplace=True)),这样任何修改都将应用于原始 DataFrame,否则将返回新的 DataFrame 对象。

  • 以下操作,都来自调用表格导入数据
import pandas as pd
df = pd.read_excel('./data/demo_06.xlsx', sheet_name='Sheet1')

1、处理缺失值:

  • 理解:对于所获取数据中如果有缺失值(空值),可以通过查找缺失值、填充缺失值、删除缺失值的方法来处理
  • 通过查看字段信息检查是否有缺失值:df.info()
  • 查看每列空值数量:df.isnull().sum() # 显示每列空值总数
  • 查看每列是否存在空值:
# any: or 或
df.isnull().any()
  • 填充缺失值:
    • 填充缺失值方法
      • 均值(mean):正态分布
      • 众数(mode):分类变量
      • 中位数(median):非正态分布
# 众数可能存在多个,通过众数填充
most = df['类别'].mode()[0]
df['类别'] = df['类别'].fillna(most)

# 向前填充,forward
df['类别'] = df['类别'].fillna(method='ffill')

# 向后填充,backward
df['类别'] = df['类别'].fillna(method='bfill')
  • 删除缺失值:
# 删除存在空值的行,整表判断
df.dropna()

# 删除指定列存在空值的行,其中一列存在空值则删除整行(or)
df.dropna(how='any', subset=['产品数量', '类别'])

# 删除指定列存在空值的行,指定列都存在空值则删除整行(and)
df.dropna(how='all', subset=['产品数量', '类别'])

# 删除非空值小于4个的行(不删存在4个非空值的行)
df.dropna(thresh=4)

2、处理重复值:

  • 理解:对于所获取数据中如果有重复值,可以通过判断是否有重复值、删除重复值的方法来处理
  • 查看每行是否完全重复:df.duplicated()
  • 删除整行完全重复的数据:df.drop_duplicates(keep=‘last’) # keep是指保留重复数据的哪一条
  • 用列索引作为判断依据,如果有重复则删除改列对应重复值所在的行:
    • df.drop_duplicates(subset=‘用户ID’, keep=‘first’)
    • df.drop_duplicates(subset=[‘用户ID’, ‘产品名称’], keep=‘last’)

3、数据筛选:

  • 理解:对于所获取数据中如果有重复值,可以给通过数据筛选来显示满足对应列索引要求的数据
  • query方法筛选(and、or、not,&、|、~)
  • 数值范围筛选
  • 时间段筛选(先转化为索引,再筛选)
# 数值筛选
df.query('产品数量 >= 2')
# 文本筛选
df.query('类别 == "优选"')
# df.query("类别 == '优选'")
# 组合筛选
df.query('类别 == "优选" and 产品数量 >= 2')

# 左包含右包含
df[df['产品数量'].between(3, 5)]

# 筛选时间段在12:00:00-23:00:00之间的数据
tb = df.set_index('订单付款时间')
tb.between_time('12:00:00', '23:00:00')

# 时间点筛选
tb = df.set_index('订单付款时间')
tb.at_time('22:54:26')

4、数据清洗:

  • 理解:对于所获取数据中如果有重复值,可以通过pandas中的高级函数来修改对应内容
  • 普通方法筛选:df.filter(items=[‘用户ID’, ‘产品清单’])
  • 正则方法筛选:df.filter(regex=‘用户ID|第\d+次交易金额’)
  • 特殊操作:
# 字段合并
pd.Series.str.cat()
df['基本信息'] = df['性别'].str.cat(df['年龄'], sep=',')

内容替换
pd.Series.str.replace()
df['交易金额'].str.replace('元', '').astype(int)
# astype(int)是把操作结束的数据转为整型

信息提取
pd.Series.str.extract()
df['手机号码'] = df['联系方式'].str.extract(pat='(\d{11})', expand=True)

# 爆炸序列:一行拆分成多行
tb = df[['用户ID', '产品清单']].copy()
# split+explode
tb['产品清单'] = tb['产品清单'].str.split(',', expand=False)
tb = tb.explode(column='产品清单', ignore_index=True)
# ignore_index=True:目的是把分裂出的行重新排序,否则,分裂出的行会沿用之前的索引行号

# 文本聚合:多行合并成一行
df[['用户ID', '产品清单']]
tb.groupby('用户ID', as_index=False).agg(lambda x: ','.join(x))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据分析08——Pandas中对数据进行数据清洗 的相关文章

随机推荐

  • 虚节点解法(有点像快慢指针?)---203. 移除链表元素

    Definition for singly linked list public class ListNode int val ListNode next ListNode ListNode int val this val val Lis
  • 激光焊接汽车尼龙塑料配件透光率测试仪

    激光塑性成型技术是近年来塑性加工界出现的一种新技术 通常塑料主要是通过加热加压依赖模具成型 这对于单品种 大批量生产是有效的 而对于各种不同形状的塑料制件则需要昂贵的模具 装置也较庞大 高度聚焦的激光束垂直照射在待变形的板料上 由于塑料直接
  • .rar .zip 格式压缩/解压缩命令

    安装rar工具命令 sudo apt get install rar 安装不成功就重新启动虚拟机 rar x test rar 解压缩test文件 rar a test rar test 将目标文件test压缩为test rar zip r
  • Laya air 之实现按钮控制人物驱动模块

    国际惯例 先上效果图 一 场景布置 ok 下面将介绍如果实现摇杆操作物体 在这里我会创建一个res的文件夹用来存放这三张图 创建一个but节点挂到场景节点下 分别将内圆和外圆的图片挂载到该节点下 更名为out cricle和in cricl
  • ImportError: cannot import name ‘OrderedDict‘ from ‘typing‘ (/root/miniconda3/envs/clip/lib/...)

    出现这个错误的原因是因为python和pytorch的版本不一致 pytorch里的torchvision模块需要从typing中导入OrderedDict 但是python 3 7对应的typing包里没有OrderedDict 所以无法
  • vue 常见指令 双向绑定原理

    1 淘宝镜像 npm 的下载是需要访问国外服务器才可以下载 但是国内访问很慢 所以淘宝集团 自行搭建了一个服务器 这个服务器每隔10分钟就会把npm国外服务器的内容拉去一次 就叫淘宝镜像 要使用需要配置 npm i g cnpm regis
  • [Nowcoder] Agamemnon‘s Odyssey

    链接 Agamemnon the great king of Mycenae was assembling his troops in Aulis to sail to the shores of Troy when he had a vi
  • 交换字符使得字符串相同--贪心算法

    LeetCode 交换字符使得字符串相同 有两个长度相同的字符串 s1 和 s2 且它们其中 只含有 字符 x 和 y 你需要通过 交换字符 的方式使这两个字符串相同 每次 交换字符 的时候 你都可以在两个字符串中各选一个字符进行交换 交换
  • java map equals_Java HashMap equals()方法

    Java HashMap equals 方法 java util HashMap equals 方法用于检查两个HashMap之间的相等性 它验证作为参数传递的一个映射的元素是否等于该映射的元素 1 语法 public boolean eq
  • SOA中的两个概念:编制(orchestration)和编排(choreography)

    以下是摘自 Understanding SOA with Web Services 中文版 关于两个概念的解释 编制 orchestration 和编排 choreography 是常用于描述 合成Web服务的两种方式 的术语 虽然它们有共
  • C 和 C++的区别 / struct 和 class 的区别 / 指针和引用的区别 / new 与 malloc 的区别 / 堆和栈的区别 / sizeof 和 strlen 的区别

    C 和 C 的区别 主要从以下三个方面来谈 设计思想 编程思想方面 语言特性方面 语法 内存管理 库 执行效率方面 C 和 C 的区别 C 是面向过程的语言 而 C 是面向对象的语言 因此 C 语言中有类和对象以及继承多态这样的面向对象语言
  • maskrcnn-benchmark训练自己数据集用于视觉分割

    1 标记数据用labelme 建议用ubuntu版本去做 因为window可能因为这个需要环境改变影响其他 自己犯过这个问题 https github com wkentaro labelme 2 labelme转化成coco数据集用于分割
  • Hyperlynx仿真操作小点

    一 改变传输线的属性 双击传输线 在对话框中选择要的线型 设置部分线的阻抗 点击edit coupling regions栏 选择右上方的edit stackup 编辑想要的叠层属性 通常改变顶底层和电源层 地层之间的PP厚度 10 8 5
  • 使用Python和XPath解析动态JSON数据

    JSON动态数据在Python中扮演着重要的角色 为开发者提供了处理实时和灵活数据的能力 Python作为一种强大的编程语言 提供了丰富的工具和库来处理动态JSON数据使得解析和处理动态JSON数据变得简单和高效 例如 使用内置的json模
  • python自动化处理,PPT处理

    一 PPT相关库介绍 安装python pptx库 同其他文件转换pptx2md rst2pptx 导入库 import pptx 初始化 ppt pptx Presentation 二 幻灯片层次结构说明 PPT文件结构 PPT文件结构指
  • 深入理解JVM—垃圾回收机制

    一 前言 明确垃圾收集器关注的部分 堆和方法区 着重学习如何确定哪些垃圾需要回收 垃圾回收算法以及GC触发条件 二 如何确定哪些垃圾需要回收 1 引用计数算法 在对象中添加一个引用计数器 每当有一个地方引用它时 计数器值就加一 当引用失效时
  • ROS2系统节点开机自启动

    要将ROS2节点设置为开机自启动 您可以创建一个systemd服务单元来管理它 一 创建launch文件 cd ros2 ws mkdir launch touch launch ros launch py 编辑内容 from launch
  • # 解析bt文件_PC端BT资源搜索及下载,诸位请节制!

    Hello大家好 这里是TopOne软件管家 毕竟要求的人太多了 今天将我测试最好的搭配给大家分享一下 当然 这个是站在我的角度 大家可以根据自己的使用情况进行调整 今天分享的是PC端 由于Mac限制 苹果电脑现只提供BT搜索软件 BT搜索
  • Windows下基于WSL2的Ubuntu开发环境搭建

    1 背景介绍 Windows是市场占有率最高的桌面操作系统 嵌入式开发领域一般需要搭建ubuntu虚拟机环境以实现linux下的交叉编译等工作 传统的Vmvare Ubuntu虚拟机安装过程繁琐且资源消耗巨大 自从Windows提供WSL2
  • 数据分析08——Pandas中对数据进行数据清洗

    0 前言 使用pandas修改数据是否会改变源数据 Pandas 对 DataFrame 的操作通常是针对原始数据本身而不是其副本的 例如 当我们使用 loc 或 iloc 方法选择 DataFrame 中的某行或某列并进行修改时 实际上是