数据清洗2

一、置换和随机采样(permutation,sample)

  1. 随机置换(打乱排序(洗牌))函数:numpy.random.permutation ,可以对一个序列进行随机排序,常用于数据集随机划分等场景

    np.random.permutation(x):如果x是一个整数n,它会返回一个打乱的0到n-1的整数数组(可以看成一个打乱的位置索引)
    如果x是一个数组,它会返回一个打乱顺序后的新数组

print(np.random.permutation(5))
# 输出 [1 2 0 3 4]arr = np.array(['cat', 'dog', 'bird', "fish"])
print(np.random.permutation(arr))
# 输出: ['bird' 'fish' 'cat' 'dog']df = pd.DataFrame(np.arange(5*7).reshape((5,7)))
sampler = np.random.permutation(5)
df.take(sampler) # take()函数默认是行索引,因此再此处就是将df的行索引顺序设置成为打乱后的行索引
sampler = np.random.permutation(7)
df.take(sampler,axis="columns") # 对列索引进行打乱
  1. 随机采样函数:sample()
  • 默认随机抽取是无放回的抽样(抽样结果中一定没有重复的抽样数据),将replace 设置为True则会变成有放回的抽样(抽样结果中可能有重复的数据)
  • weight: 设置每行/每列被取到的权重比
# 无放回抽样 (默认)
sample = df.sample(n=3)  # 抽取3行
sample = df.sample(frac=0.6)  # 抽取60%的数据# 有放回抽样
sample_with_replacement = df.sample(n=10, replace=True)  # 抽取10行,可能有重复# 根据权重列抽样
weights = [0.1, 0.2, 0.3, 0.2, 0.2]
weighted_sample = df.sample(n=2, weights=weights)

二、计算分类编码(get_dummies

get_dummies()是Pandas中用于执行独热编码(One-Hot Encoding)的函数,它将分类变量/特征转换为机器学习算法更易处理的数值形式

  • data: 要转换的数据(Series/DataFrame)
  • prefix: 为生成的列添加前缀
  • prefix_sep: 前缀分隔符(默认为"_")
  • dummy_na: 是否创建NaN的指示列(默认为False)
  • columns: 指定要转换的列(当输入是DataFrame时)
  • drop_first: 是否删除第一个类别(避免多重共线性)
  • dtype: 输出数据类型(默认为uint8)
import pandas as pd# 示例数据
df = pd.DataFrame({'颜色': ['红', '蓝', '绿', '蓝', '红'],'尺寸': ['大', '中', '小', '大', '中']
})
df
# 基本编码
pd.get_dummies(df) # 生成将df中每个列名中的唯一的数据作为列名,的独特编码的dataframe
pd.get_dummies(df["尺寸"]).replace({True:1, False:0}) # 生成将df["尺寸"]中的数据作为列名的独特编码的dataframe
pd.get_dummies(df, prefix=['col', 'size']) # 自定义前缀
# 设置nan列
df.loc[2, '颜色'] = None
pd.get_dummies(df, dummy_na=True)

三、pandas扩展数据类型(Int8Dtype 、BooleanDtype、StringDtype、category

pandas原本建立在Numpy功能之上,所以数据类型沿用的numpy,这有一些问题:

  • 整数,布尔值的缺失值被当成浮点数,导致不易察觉的问题

  • 含有大量字符串数据时,计算开销大,同时占用很多内存

  • 日期数据类型、稀疏数据的处理问题

  • 因此派生出pandas扩展数据类型:

    • pd.Int8Dtype / pd.Int16Dtype 替代 int数据类型
    • pd.BooleanDtype 替代 bool数据类型
    • pd.StringDtype 代替 object 数据类型,可被认为数string处理
    s = pd.Series([1,2,3,None])	# 缺失值显示NAN
    s.dtype     				# 显示float64  nan解析成小数,但本质是想要整数的数据类型
    # 用pandas的数据类型创建它,dtype执行,series的数据类型
    s = pd.Series([1,2,3,None], dtype=pd.Int64Dtype())  # 缺失值显示<NA>表示整数类型的缺失值
    s.dtype    #  Int64Dtype()  代替int64,这种扩展的类型支持带有缺失值的整数类型s = pd.Series(["one", "two", None, "three"])
    s.dtype		# 显示object类型
    s = pd.Series(["one", "two", None, "three"], dtype=pd.StringDtype())
    s.dtype		# 显示StringDtype类型,将所有数据优先认为str处理s = pd.Series([True, False, None])
    s.dtype  #  dtype('O')  表示数据类型为对象。这通常意味着该列包含字符串或混合类型的数据。但想要的是bool类型,只是包含了一个缺失值而已
    s = pd.Series([True, False, None], dtype=pd.BooleanDtype())
    s.dtype  # BooleanDtype,代替bool类型,支持由有缺失值的bool类型
    • pd.CategoricalDtype(简写就是category) 分类数据类型,在groupby、sort、value_counts 等操作中比 object 类型更快。
    • 其他的(暂时还没用到)
    # 创建自定义的数据dataframe
    fruits = ["apple", "orange", "apple", "apple"] * 10
    N = len(fruits)
    rng = np.random.default_rng(seed=100)
    df = pd.DataFrame({'fruit': fruits,'basket_id': np.arange(N),'count': rng.integers(3, 15, size=N),'weight': rng.uniform(0, 4, size=N)},columns=['basket_id', 'fruit', 'count', 'weight'])
    # 查看category 和普通的 object 类型数据的差异
    print(df.info())  # 内存占用memory usage: 11.1+ KB
    df = df.astype(dtype={'fruit': 'category', 'weight': 'category'})
    print(df.info())  # 内存占用memory usage: 5.8 KB
    df["fruit"] = df["fruit"].cat.add_categories(["other"])  # 动态增加fruit类别
    print(df["fruit"])
    df["fruit"].cat.remove_unused_categories() # 删除没用在数据表中的类别# 创建分类对象1:可以从其他python序列直接创建 pd.Categorical,传入的是类别值(未被分类的数据)
    my_categories = pd.Categorical(['foo', 'bar', 'baz', 'foo', 'bar'])
    my_categories# 创建分类对象2:已经获取了数据的分类编码 和 具体类别,可以用from_codes把数据的分类编码转成对应类别
    categories = ["foo", "bar", "baz"]
    codes = [0, 1, 2, 0, 0, 1]
    my_cats_2 = pd.Categorical.from_codes(codes, categories)
    my_cats_2# 注意:默认分类没有顺序,from_codes通过ordered参数指定为True可以指定数学上的顺序
    ordered_cat = pd.Categorical.from_codes(codes, categories, ordered=True)
    ordered_cat  # foo<bar<baz,ordered=True 不是"允许比较",而是"声明这些类别有真实顺序关系,请按我定义的顺序处理比较和排序"。就像告诉Pandas:"这些不是随便的标签,它们是有实际意义的等级/大小
    # 使用了ordered = True之后,原本的series就拥有了部分数字的功能,能够对其使用一些数学函数
    my_cats_2.as_ordered()  # 对无序的分类对象通过as_ordered排序  。相当于 pandas_categorical的实例.as_ordered()
    
%timeit (测量代码的执行时间) %prun(性能分析)或 %memit(内存测量)魔法命令使用

四、采用正则表达式处理字符串

正则表达式提供在文本中搜索和匹配字符串模式的灵活方式, 正则表达式常称作regex,是根据正则表达式语言编写的字符串python的re模块负责对字符串应用正则表达式re模块的函数可以分为三类:模式匹配:  findall(返回所有匹配的子串列表),  search(扫描整个字符串查找匹配,返回第一个符合条件的子串),   match(只匹配出现在字符串开始位置的模式,开始不符合就直接返回none);替换: sub(替换值,原始值:替换匹配字符串), subn, 拆分: split; regex描述的是在文本中定位的模式
  • 使用re.compile() 将正则表达式字符串编译成一个正则表达式对象,可以用于匹配字符串
    # import re
    text = """Dave dave@google.com
    Steve steve@gmail.com
    Rob rob@gmail.com
    Ryan ryan@yahoo.com"""pattern = r"[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}"  # 识别电子邮件地址的正则表达式
    regex = re.compile(pattern, flags=re.IGNORECASE) # flags设置的参数表示正则表达式不区分大小写
为什么要用 re.compile?提高效率:如果同一个正则表达式需要多次使用,编译后可以避免重复解析正则表达式字符串。代码更清晰:编译后的对象可以复用,使代码更模块化。支持更多操作:编译后的对象可以直接调用 match()、search()、findall() 等方法。

五、字符串操作

  • python字符串对象的内置方法能轻松完成大部分文本运算, 对于更复杂的模式匹配和文本操作,则可能需要用到正则表达式
  • pandas基于python的字符串方法,做了加强,能够对整组数据应用字符串方法和正则表达式,处理缺失数据

1、字符串分割与拼接

  • str.split(sep, n=-1, expand=False) : 按指定分隔符(sep)分割字符串,n 控制分割次数,expand=True 返回 DataFrame。
  • str.rsplit(sep, n=-1, expand=False) : 从右侧开始分割字符串。
  • str.join(iterable) : 用指定字符串连接序列中的元素。
  • str.cat(others=None, sep=None, na_rep=None) : 拼接字符串,支持与其他 Series 或列表拼接。
    df["Name"].str.split(",", expand=True)  # 分割成多列
    df["Words"].str.join("-")  # 将列表中的字符串用 "-" 连接
    df["First"].str.cat(df["Last"], sep=" ")  # 合并两列
    

2、字符串匹配与提取

  • str.contains(pat, case=True, regex=True) : 检查字符串是否包含指定模式(支持正则表达式)。

  • str.match(pat, case=True) : 检查字符串是否以指定模式开头(正则表达式)。

  • str.find(sub) / str.rfind(sub) : 返回子字符串的首次/最后一次出现位置(未找到返回 -1)。

    df["fruit"].str.contains("apple|orange", case=False)  # 不区分大小写
    df["fruit"].str.match("a") # 是否以a字母开头
    df["fruit"].str.find("p")   # apple中返回1
    df["fruit"].str.rfind("p")  # apple中返回2
    

3、字符串替换

  • str.replace(pat, repl, regex=True) : 替换字符串中的模式(支持正则表达式)。

  • str.strip(to_strip=None) / str.lstrip() / str.rstrip() : 去除字符串两端的空白字符(或指定字符)。

  • str.translate(table) : 接受一个字典作为参数,字典的键是要替代的字符的Unicode码,值是相应的映射字Unicode码。

      df["Phone"].str.replace(r'\D', '', regex=True)  # 移除非数字字符ord("a") # 97chr(98) # 'b'df["fruit"].str.translate({97: 98}) # 将字符串中的a转化成b
    

4、字符串格式化与填充

  • str.lower() / str.upper() / str.title() / str.capitalize() : 转换大小写

  • str.pad(width, side='left', fillchar=' ') : 填充字符串到指定长度。

    df["Name"].str.title()  # 首字母大写
    df["ID"].str.pad(5, side="left", fillchar="0")  # 左填充 0
    
  • str.zfill(width) : 用 0 左填充字符串(类似 pad 但固定填充 0)。

5、字符串长度与索引

  • str.len() : 返回字符串长度。

  • str.get(i) : 获取字符串的第 i 个字符(类似 Python 的索引)。

  • str.slice(start, stop, step) : 切片操作(类似 Python 的字符串切片)。

    df["Text"].str.len()  # 计算每个字符串的长度
    df["Code"].str.get(0)  # 获取第一个字符
    df["Date"].str.slice(0, 4)  # 提取前 4 个字符(年份)
    

6、字符串判断

  • str.isalpha() / str.isnumeric() / str.isalnum() : 检查字符串是否全为字母/数字/字母或数字。

  • str.startswith(pat) / str.endswith(pat) : 检查字符串是否以指定模式开头或结尾。

    df["URL"].str.endswith(".com")
    df["Password"].str.isalnum()  # 是否只含字母和数字
    

7、其他实用方法

  • str.wrap(width, **kwargs) : 自动换行(按指定宽度分割字符串)。

  • str.repeat(n) : 重复字符串 n 次。

  • str.count(pat) : 统计子字符串出现的次数。

    df["Sentence"].str.count("the")  # 统计 "the" 出现次数
    df["Symbol"].str.repeat(3)  # 如 "A" → "AAA"
    

总结

  • 数据清洗,准备工作做的好可以让数据分析过程更顺畅,提高生产力
  • 数据清洗: 缺失值处理, 重复值删除,数据转换和替换,检测和过滤异常值
  • 数据准备: 重命名轴索引,分箱, 数据重排和采样,pandas扩展类型, 分类类型,字符串方法

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

按月设置索引名的完整指南:Elasticsearch日期索引实践

按月设置索引名的完整指南:Elasticsearch日期索引实践 在时序数据场景中,按月设置索引名(如logs-2024-01)是优化查询效率、降低管理成本的关键策略。以下是三种实现方案及详细步骤: 方案一:索引模板 + 日期数学表达式(推荐) 原理:利用ES内置的日期数学表达式动态生成…

西南交通大学【机器学习实验7】

实验目的 理解和掌握朴素贝叶斯基本原理和方法&#xff0c;理解极大似然估计方法&#xff0c;理解先验概率分布和后验概率分布等概念&#xff0c;掌握朴素贝叶斯分类器训练方法。 实验要求 给定数据集&#xff0c;编程实现朴素贝叶斯分类算法&#xff0c;计算相应先验概率&a…

java生成pdf文件

1.依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>8.0.4</version><type>pom</type></dependency> 2.代码 package org.example;import com.itextpdf.io.image…

macOS挂载iOS应用沙盒文件夹

背景 工具 libimobiledevice: linux&#xff0c;macOS等与ios设备通信是的工具 macFUSE 是 macOS 文件系统扩展的“引擎”&#xff0c;支持开发者创建各类虚拟文件系统。 iFUSE 是专为 iOS 设备设计的“连接器”&#xff0c;需依赖 macFUSE 实现功能。 若需访问 iPhone/iP…

嵌入式软件面经(四)Q:请说明在 ILP32、LP64 与 LLP64 三种数据模型下,常见基本类型及指针的 sizeof 值差异,并简要解释其原因

从事嵌入式开发深入理解 ILP32、LP64、LLP64 三种主流数据模型及其在平台上的实际表现&#xff0c;可以帮助我们避免诸如类型越界、结构错位、指针截断等致命错误。 一、何为数据模型&#xff1f;为何重要&#xff1f; 数据模型&#xff08;Data Model&#xff09;是指在某一编…

计算机组成原理与体系结构-实验二 ALU(Proteus 8.15)

目录 一、实验目的 二、实验内容 三、实验器件 四、实验原理 五、实验步骤 六、思考题 一、实验目的 1、了解算术逻辑运算器&#xff08;74LS181&#xff09;的组成和功能。 2、掌握基本算术和逻辑运算的实现方法。 二、实验内容 设计算数逻辑运算器系统的通路&#x…

ubuntu下免sudo执行docker

前言 在ubuntu中&#xff0c;默认是无法使用root账号的&#xff0c;安装完docker后&#xff0c;不可避免的要使用sudo来执行docker命令&#xff0c;这就让运维变得很麻烦 避免sudo # 添加当前用户到 docker 组 sudo usermod -aG docker $USER# 刷新组权限 newgrp docker# 验…

微处理原理与应用篇---STM32寄存器控制GPIO

在 ARM 架构下使用 C 语言控制 32 位寄存器实现 GPIO 操作&#xff0c;需结合芯片手册进行寄存器映射和位操作。以下以 STM32F103&#xff08;Cortex-M3 内核&#xff09;为例&#xff0c;详细介绍实现方法&#xff1a; 一、STM32F103 GPIO 控制&#xff08;标准外设库&#x…

基于OPUS-MT模型的中译英程序实现

这是我的kaggle账号名“fuliuqin” 代码参考如下&#xff1a; nlp.paperflq | KaggleExplore and run machine learning code with Kaggle Notebooks | Using data from [Private Datasource]https://www.kaggle.com/code/fuliuqin/nlp-paperflq 目录 绪论 研究背景与意义 研究…

炸鸡派-定时器基础例程

定时器简介 基本定时器&#xff0c;计数中断、产生DMA请求。 通用定时器&#xff0c;PWM输出、输入捕获、脉冲计数。 高级定时器&#xff0c;输出比较、互补输出带死区控制、PWM输入。 中心对齐的计数模式可以生成对称的PWM波形信号。计数可以先增后减。 这种模式下&#xff…

利用不坑盒子的Copilot,快速排值班表

马上放暑假了&#xff0c;有多少人拼命排值班表的&#xff1f; 今天用我亲身制作值班表的一些Excel操作&#xff0c;给大家分享一些在Excel中的小技巧&#xff0c;需要的及时收藏&#xff0c;有一天用得上~ 值班表全貌 先给大家看看我制作的值班表的样子&#xff0c;应该大家…

Linux 面试知识(附常见命令)

目录结构与重要文件 Linux 中一切皆文件&#xff0c;掌握目录结构有助于理解系统管理与配置。 目录说明/根目录&#xff0c;所有文件起点/bin基本命令的可执行文件&#xff0c;如 ls, cp/sbin系统管理员用的命令&#xff0c;如 shutdown/etc配置文件目录&#xff0c;如 /etc/…

Lua 安装使用教程

一、Lua 简介 Lua 是一门轻量级、高性能的脚本语言&#xff0c;具有简洁语法、嵌入性强、可扩展性高等特点。广泛应用于游戏开发&#xff08;如 Roblox、World of Warcraft&#xff09;、嵌入式开发、配置脚本、Nginx 扩展&#xff08;OpenResty&#xff09;等领域。 二、Lua …

SPAD像素概念理解

SPAD(Single Photon Avalanche Diode,单光子雪崩二极管)像素是一种能够检测单个光子的超灵敏光电探测器,其核心原理是通过雪崩倍增效应将单个光子产生的微弱电流信号放大到可观测水平。 一、工作原理 雪崩倍增效应 当SPAD反向偏压超过其击穿电压时,进入盖革模式(Geiger M…

SSSSS

#include <iostream> void LineOf(bool** n1, bool** n2, int column, int raw, int* result) { for (int i 0; i < column; i) { int d -1, n -1; // 反向遍历&#xff0c;找最后一个 true for (int j raw - 1; j > 0; j--) { …

【AI智能体】社交娱乐-智能助教

智能助教是扣子官方提供的教育类智能体模板。助教模板分为学习陪伴和作业批改两种场景&#xff0c;分别适用于学生角色和教师角色&#xff0c;你可以根据需求选择对应的模板&#xff0c;并将其改造为其他学科或其他教育阶段的智能助教。 模板介绍 在智能学伴/助教的落地过程中…

自动化保护 AWS ECS Fargate 服务:使用 Prisma Cloud 实现容器安全

引言 在云原生时代,容器化技术已成为现代应用部署的标准方式。AWS ECS Fargate 作为一种无服务器容器服务,让开发者能够轻松运行容器化应用而无需管理底层基础设施。然而,随着容器技术的普及,安全问题也日益突出。本文将介绍如何通过 Python 脚本自动化地为 ECS Fargate 服…

Kafka Controller 元数据解析与故障恢复实战指南

#作者&#xff1a;张桐瑞 文章目录 1 生产案例&#xff1a;Controller 选举在故障恢复中的关键作用1.1 问题背景1.2 核心操作原理&#xff1a; 2 Controller 元数据全景&#xff1a;从 ZooKeeper 到内存的数据镜像2.1元数据核心载体&#xff1a;ControllerContext 类2.2核心元…

《寻北技术的全面剖析与应用前景研究报告》

一、引言 1.1 研究背景与意义 寻北&#xff0c;作为确定地理北极方向的关键技术&#xff0c;在众多领域中扮演着举足轻重的角色。在军事领域&#xff0c;精确的寻北对于武器系统的瞄准、导弹的精确制导以及部队的战略部署都至关重要。例如&#xff0c;火炮在发射前需要精确寻…

深入比较 Gin 与 Beego:Go Web 框架的两大选择

引言 在 Go 语言生态系统中&#xff0c;Gin 和 Beego 是两个非常受欢迎的 Web 框架。它们各自有着不同的设计理念和目标用户群体。本文将对这两个框架进行深入比较&#xff0c;并帮助你理解它们之间的区别&#xff0c;以便根据项目需求做出合适的选择。 一、Gin 概述 Gin是一…