2.Pandas数据预处理

2.1 数据清洗

以titanic数据为例。

df = pd.read_csv('titanic.csv')

2.1.1 缺失值

(1)缺失判断

df.isnull()

(2)缺失统计

# 列缺失统计 
df.isnull().sum(axis=0)

# 行缺失统计 
df.isnull().sum(axis=1)

# 统计缺失率 
df.isnull().mean(axis=0)

(3)缺失删除

# 删除有缺失值的行 
df.dropna(axis=0) 
# 删除有缺失值的列 
df.dropna(axis=1) 
# 删除至少有两个缺失值的行 
df.dropna(thresh=2) 
# 指定判断缺失值的列范围 
df.dropna(subset=['Survived','Pclass']) 
# 指定某列的缺失值删除 
df['Sex'].dropna()

(4)缺失筛选

# 筛选有缺失值的行 
df.loc[df.isna().any(1)] 
# 筛选有缺失值的列 
df.loc[:,df.isna().any()] 
# 查询没有缺失值的行 
df.loc[~(df.isna().any(1))] 
# 查询没有缺失值的列 
df.loc[:,~(df.isna().any())] 

### 筛选缺失率大于0.7的列 
# 设置缺失率阈值 
cutoff = 0.7 
cond = df.isnull().mean(axis=0) > 0.7 
# 缺失率>0.7的变量 
drop_list = [k for k,v in cond.to_dict().items() if v==True] 
# 缺失率<=0.7的变量 
keep_list = [k for k,v in cond.to_dict().items() if v==False] 
# 缺失率大于0.7的列 
df[drop_list] 
# 缺失率小于0.7的列 
df[keep_list]

(5)缺失填充

### fillna()函数填充 
# 将所有缺失值填充为0 
df.fillna(0) 
# 将缺失值填充为指定字符 
df.fillna('x') 
# 指定字段填充,此处用均值 
df.Age.fillna(df['Age'].mean()) 
# 只替换一个 df.fillna(0, limit=1) 

### replace()函数填充 
# 将指定列的空值替换成指定值 
df.replace({'Age':{np.nan:df['Age'].mean()}}) 

### mask()函数替换 
tc = df['Age'].mean() 
cond = df['Age'].isnull()==True 
df['Age'] = df['Age'].mask(cond, tc) 

### interpolate()插值填充 
df.Age.interpolate()         #默认线性插值

2.1.2 重复值

(1)重复查询

df.duplicated(subset=['name', 'birthday'], keep='first')   # 按姓名和生日查询,除第一个重复值以外的其余重复值都被筛选出来

(2)重复统计

# 对user列查重并统计重复数量 
df.duplicated(subset=['user'], keep=False).sum(axis=0)      # keep=False所有重复值都被筛选出来 

# 对user列查重并统计重复率 
df.duplicated(subset=['user'], keep=False).mean(axis=0)

(3)重复删除

# 对全部列去重,在原数据frame上生效 
df.drop_duplicates(inplace=True) 

# 对user列去重,在原数据frame上生效 
df.drop_duplicated(subset=['user'], inplace=True) 

# 对user、hobby列去重,保留最后一个重复行 
df.drop_duplicated(subset=['user','hobby'],keep='last',inplace=True)

(4)索引重置

# 索引重置
df.drop_duplicates(subset=['user'],keep='first').reset_index(drop=True)

(5)先排序再去重

当重复数据有排序行时,一定要对数据排序后在进行去重处理。

# 排序 
df = df.sort_values(by=['user','price'],ascending=True).reset_index(drop=True) 

# 去重 
df = df.drop_duplicated(subset=['user'],keep='first').reset_index(drop=True)

2.1.3 数据替换

(1)loc/iloc赋值

# 第1行第3列的数据替换为4 
df.iloc[0:1,2:3] = 4 

# 将Age均值替换空值 
df.loc[(df['Age'].isnull()==True), 'Age'] = df['Age'].mean() 

# 将Pclass3以上替换为'3+' 
df['Pclass'] = df['Pclass'].astype(str) df.loc[(df['Pclass']>=3), 'Pclass'] = '3+'

(2)replace替换

### 指定值替换 
# 数值替换 
s.replace(to_replace=0, value=5) 
# 字符替换 
df.replace(to_replace='S', value='C') 
# 空值替换 
df.replace(to_replace='.', value=np.nan) 
# 列表一一替换 
df.replace(to_replace=[0,1,2,3,4], value=[4,3,2,1,0]) 
# to_replace为字典时 
s.replace(to_replace={0:10, 1:100})        # 此时按字典映射进行替换,value不再指定替换值 df.replace(to_replace={'Age':0.42,'Pclass':2}, value=18)       # 此时字典键为列名,值为被替换值,value为替换值 
df  = df.replace(to_replace={'Age':{0.42,18, 0.67:18}})        # 作为嵌套字典,指定将某列中的具体数据按字典映射替换,value不再指定替换值 

### method替换 
# 将1,2 替换为它们前一个值 
s.replace([1,2], method='ffill') 
# 将1,2替换为它们后一个值 
s.replace([1,2], method='bfill') 

### 正则表达式替换 
# 将Futrelle开头的值替换为FAA 
df.replace(to_replace=r'^Futrelle.*',value='FAA',regex=True) 
# 多个规则均替换为同样的值 
df.replace(regex=[r'^Futrelle.*', r'Braund.*'], value='FAA').head()
# 多个正则级对应的替换内容 
df.replace(regex={r'^Futrelle.*':'FAA', r'^Braund.*':'BAA'})

2.2 文本处理

主要是针对series.str.func的应用。

2.2.1 文本格式

(1)大小写变换

# 字符全部变成小写
s.str.lower()
# 字符全部大写
s.str.upper()
# 每个单词首字母大写
s.str.title()
# 字符串第一个字母大写
s.str.capitalize()
# 大小写字母转换
s.str.swapcase()

(2)格式判断

s.str.isalpha      # 是否为字母
s.str.isnumeric    # 是否为数字0-9
s.str.isalnum      # 是否由字母和数字组成
s.str.isupper      # 是否为大写
s.str.islower      # 是否为小写
s.str.isdigit      # 是否为数字

(3)文本对齐

# 居中对齐,宽度为8,其余用*填充
s.str.center(8, fillchar='*')
# 左对齐,宽度为8,其余用*填充
s.str.ljust(8, fillchar='*')
# 右对齐,宽度为8,其余用*填充
s.str.rjust(8, fillchar='*')
# 自定义对齐方式,参数可调整宽度,对齐方向,填充字符
s.str.pad(width=8, side='both', fillchar='*')

(4)计数编码

s.str.count('b')          # 字符串中包括指定字母的数量
s.str.len()               # 字符串长度
s.str.encode('utf-8')     # 字符编码
s.str.decode('utf-8')     # 字符解码

2.2.2 文本拆分

# 使用方法
s.str.split('x', n=1)
# 举例
df.Email.str.split('@')
# expand=True   可以让拆分的内容扩展成单独一列
df.Email.str.split('@', expand=True)
# 同时通过@和.进行拆分成三部分
df.Email.str.split('@|\.', expand=True)

2.2.3 文本替换

(1)replace替换

# 将email种的com都替换为cn
df.Email.str.replace('com', 'cn')

# 将@之前的名字都替换为xxx
df.Email.str.replace('(.*?)@', 'xxx@')

# 将替换内容传递给lambda隐函数实现字符大写功能
df.Email.str.replace('(.*?)@', lambda x:x.group().upper())

(2)切片替换

df.Email.str.slice_replace(start=1, stop=2, repl='XX')

(3)重复替换

df.name.str.repeat(repeats=2)

2.2.4 文本拼接

(1)单Series序列拼接

# name列series直接拼接
df.name.str.cat()

# 设置sep分隔符为'-'
df.name.str.cat(sep='-')

# 将缺失值设置为*
df.name.str.cat(sep='-', na_rep='*')

(2)多series序列拼接

# 设置others后,cat会将series和others定义的序列进行拼接
df.name.str.cat(others=['*']*6)

# 多列拼接
df.name.str.cat([df.Email, df.level], sep='-', na_rep='*')

2.2.5 文本提取

# extrac
df.Email.extract(pat='(,*?)@(.*).com')

# extractall多返回一列match
df.Email.extractall(pat='(,*?)@(.*).com')

2.2.6 文本查询

### find:返回原字符串的位置,没有返回-1
df.Email.str.find('@')

### findall:支持正则表达式
df.Email.str.findall('(,*?)@(.*).com')

2.2.7 文本包含

配合loc用于查询。

df.loc[df.Email.str.contains('com|Mike', na=False)]

2.2.8 文本哑变量

df.name.str.get_dummies()

2.3 时间处理

2.3.1 时间类型

Timestamp

最基础的时间类,表示某个确切的时间点。在绝大多数的场景中的时间数据都是Timestamp形式的事件类型

Period

表示单个时间跨度,或者某个时间段,例如某一天,某一小时等。

Timedelta

Timedelta表示不同单位的时间,例如1天、1.5小时、3分钟、4秒等,并非具体的某个时间段。

DatetimeIndex

一组Timestamp构成的index

PeriodtimeIndex

一组Period构成的index

TimedeltaIndex

一组Timedelta构成的index

### 创建方式
# 时间戳创建
pd.Timestamp(1990,1,1)

# 时间差创建
pd.Timedelta('1days 1minute')

# 时间周期创建
pd.Period(2023, freq='M')

2.3.2 时间类型转换

(1)to_datetime

df = pd.to_datetime(df)
df['a'] = pd.to_datetime(df['a'], format='%Y.%m.%d')

(2)to_timedelta

pd.to_timedelta(['1days 1minute', '2days 2minute'])

2.3.2 时间类型属性

(1)Timestamp

可以实现时间信息的提取、判断、格式变换。

# 属性
s.dt.date          # 转换为object类型的日期
s.dt.year
s.dt.quarter       # 季节
s.dt.month
s.dt.hour
s.dt.minute
s.dt.second
s.dt.nanosecond    # 纳秒
s.dt.weekday       # 工作日第几天
s.dt.day           # 一个月当中的第几日
s.dt.day_of_week   # 一周中第几天
s.dt.day_of_year   # 一年中第几天
s.dt.dayofweek
s.dt.dayofyear
s.dt.days_in_month # 时间所在月份总天数
s.dt.daysinmonth
s.dt.is_month_start          # 是否为月初
s.dt.is_month_end            # 是否为月末
s.dt.is_quarter_start        # 是否为季度第一天
s.dt.is_quarter_end          # 是否为季度最后一天
s.dt.is_year_start          
s.dt.is_year_end
s.dt.is_leap_year            # 是否为闰年
s.dt.time                    # 获取时分秒的具体时间
s.dt.timetz                  # 获取时分秒的具体时间+时区
s.dt.freq                    # 频率
s.dt.unit                    # 时间最小单位
# 函数
s.dt.as_unit('s')              # 转换最小单位精度
s.dt.ceil(freq='d')            # 按指定频率向上取整
s.dt.floor(freq='d')           # 按指定频率向下取整
s.dt.round(freq='d')           # 按指定频率四舍五入
s.dt.day_name()                # 时间对应的星期数,英文字符串
s.dt.month_name()              # 时间对应的月份,英文字符串
s.dt.normalize()               # 时间转换到midnight半夜
s.dt.strftime(date_format='%Y-%M-%D')         # 转换时间格式,转换后对象为object
s.dt.isocalendar()             # 日历函数,返回三个字段:年、一年中第几周、一周中第几天
s.dt.to_period()               # 转换为period类型
s.dt.to_pydatetime()           # 以numpy array形式返回Python中定义的时间差类型对象

(2)TimeDelta

# 函数
s.dt.as_unit('s')              # 转换最小单位精度
s.dt.ceil(freq='d')            # 按指定频率向上取整
s.dt.floor(freq='d')           # 按指定频率向下取整
s.dt.round(freq='d')           # 按指定频率四舍五入
s.dt.day_name()                # 时间对应的星期数,英文字符串
s.dt.month_name()              # 时间对应的月份,英文字符串
s.dt.normalize()               # 时间转换到midnight半夜
s.dt.strftime(date_format='%Y-%M-%D')         # 转换时间格式,转换后对象为object
s.dt.isocalendar()             # 日历函数,返回三个字段:年、一年中第几周、一周中第几天
s.dt.to_period()               # 转换为period类型
s.dt.to_pydatetime()           # 以numpy array形式返回Python中定义的时间差类型对象
# 函数
s.dt.as_unit('s')          # 转换最小单位精度
s.dt.ceil(freq='d')        # 按指定频率向上取整
s.dt.floor(freq='d')       # 按指定频率向下取整
s.dt.round(freq='d')       # 按指定频率四舍五入
s.dt.to_pytimedelta()      # 以numpy array形式返回Python中定义的时间差类型对象

# 将时间差的成分进行分解,并转化为具体的数值
s.dt.components

# 转换为以秒单位的数值
s.dt.total_seconds()

(3)Period

# 属性
df.dt.day                 # 每个周期的天数
df.dt.day_of_week         # 一周中的第几天
df.dt.day_of_year         # 一年中的第几天
df.dt.dayofweek
df.dt.dayofyear
df.dt.days_in_month       # 一月中的第几天
df.dt.daysinmonth
df.dt.start_time          # 一个周期的开始时间
df.dt.end_time            # 一个周期的结束时间
df.dt.is_leap_year        # 所在年是否为闰年
df.dt.freq                # 频率
df.dt.year                # 时间所在年
df.dt.quarter             # 时间所在季节
df.dt.month
df.dt.week
df.dt.hour
df.dt.weekday             # 时间所在一周中的第几天
df.dt.weekofyear          # 时间在一年中的第几周

# 函数
df.dt.to_timestamp()      # 转换为时间戳类型
df.dt.asfreq(freq='Q')    # 改变周期频率为季度
df.dt.striftime(date_format='%Y-%m-%d')        # 改变时间格式

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CC攻击的前身

CC攻击的前身是一个名为Fatboy的攻击程序&#xff0c;而之所以后来人们会称之为CC&#xff0c;是因为DDoS攻击发展的初期阶段&#xff0c;绝大部分DDoS攻击都能被业界熟知的“黑洞”&#xff08;Collapsar,一种安全防护产品&#xff09;所抵挡&#xff0c;CC攻击的诞生就是为了…

会说话,情商高:职场人士必看的情商口才提升攻略

在职场上&#xff0c;口才和情商是非常重要的软实力。能言善辩&#xff0c;与人交流得心应手&#xff0c;往往可以帮助我们更好地完成工作任务&#xff0c;并获得更多的机会和提升。那么&#xff0c;如何才能培养出好的口才和高情商呢?本文将从以下几个方面给大家提供一些建议…

JMeter-BeanShell预处理程序和BeanShell后置处理程序的应用

一、什么是BeanShell&#xff1f; BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器&#xff0c;JMeter性能测试工具也充分接纳了BeanShell解释器&#xff0c;封装成了可配置的BeanShell前置和后置处理器&#xff0c;分别是 BeanShell Pre…

Kafka 集群实现数据同步

Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统&#xff0c;不但像传统消息队列&#xff08;RaabitMQ、RocketMQ等&#xff09;那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上&#xff0c;用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…

后端接口性能优化分析-多线程优化

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

什么是模糊测试?

背景&#xff1a;近年来&#xff0c;随着信息技术的发展&#xff0c;各种新型自动化测试技术如雨后春笋般出现。其中&#xff0c;模糊测试&#xff08;fuzz testing&#xff09;技术开始受到行业关注&#xff0c;它尤其适用于发现未知的、隐蔽性较强的底层缺陷。这里&#xff0…

今天不学习今天写爱心特效HTML代码

效果&#xff1a; 操作过程 首先在桌面创建一个后缀为txt的文件&#xff0c;然后将下面的代码复制进去保存&#xff0c;再将.txt后缀改为html&#xff0c;最后点击这个文件就会出现爱心特效啦~ 具体代码如下&#xff1a; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.…

腾讯云服务器怎么样好用吗?腾讯云服务器好用吗?

大家好&#xff01;今天我们要来聊聊腾讯云服务器怎么样&#xff0c;好用吗&#xff1f;对于这个问题&#xff0c;我的答案是非常肯定的——好用&#xff01; 那么&#xff0c;腾讯云服务器究竟好在哪里呢&#xff1f; 首先&#xff0c;它的功能非常强大。它不仅能够提供云存…

通讯协议学习之路(实践部分):IIC开发实践

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 本文…

.Net 8正式发布

Net 8是官方号称有史以来性能最快的一个版本了。 .Net 8 增加了数以千计的性能、稳定性和安全性改进&#xff0c;以及平台和工具增强功能&#xff0c;有助于提高开发人员的工作效率和创新速度。 反正就是快&#xff0c;性能好、工作效率更高&#xff01; 这个版本&#xff0c…

防抖-节流-深拷贝-事件总线

一、防抖与节流 1.认识防抖与节流函数 防抖和节流的概念其实最早并不是出现在软件工程中&#xff0c;防抖是出现在电子元件中&#xff0c;节流出现在流体流动中 而JavaScript是事件驱动的&#xff0c;大量的操作会触发事件&#xff0c;加入到事件队列中处理。而对于某些频繁…

MySQL使用Xtrabackup恢复全量备份

1、下载之前的备份的全量压缩包 我使用的是备份到AWS存储桶,实验删数数据之前&#xff0c;我做了一次全量备份。 1.1 解压加密的压缩包到指定的目录 由于备份使用的是加密压缩包&#xff0c;现在解压也要用密码解压 解压格式&#xff1a; openssl enc -aes-256-cbc -d -p…

免费!IDEA插件推荐:Apipost-Helper

今天给大家推荐一款IDEA插件&#xff1a;Apipost-Helper-2.0&#xff0c;写完代码IDEA内一键生成API文档&#xff0c;无需安装、打开任何其他软件&#xff1b;写完代码IDEA内一键调试&#xff0c;无需安装、打开任何其他软件&#xff1b;生成API目录树&#xff0c;双击即可快速…

15项基本SCADA技术技能

1. 人机界面 人机界面是将操作员连接到设备、系统或机器的仪表板或用户界面。 以下是 hmi 在 scada 技术人员简历中的使用方式&#xff1a; 完成了查尔斯湖废水处理厂和提升站的完整 HMI 图形界面。对加油系统、加油车、PLC、HMI、触摸屏进行故障排除和维修。对 Horner HMI …

初识Scrapy:Python中的网页抓取神器

Scrapy是一个基于Python的快速、高层次的屏幕抓取和web抓取框架&#xff0c;用于抓取web站点并从页面中提取结构化的数据。它广泛应用于数据挖掘、监测和自动化测试等领域。Scrapy的强大之处在于它是一个框架&#xff0c;可以根据实际需求进行修改和扩展。 Scrapy的主要特点 …

1.rk3588的yolov5运行:pt_onnx_rknn转换及rknn在rk3588系统python运行

自己有点笨&#xff0c;查资料查了一周才完美的实现了yolov5在rk3588环境下的运行&#xff0c;在这里写具体步骤希望大家少走弯路。具体步骤如下&#xff1a; 一、yolov5的原代码下载及pt文件转换为onnx文件 1.yolov5的原代码下载及环境搭建 在这里一定要下载正确版本的源代码…

国家药品价格查询官网-在线网站查询方法

查询药品上市价格对于个人和机构来说都是非常有必要的&#xff0c;对个人可以很好的验证该药品是否存在虚高的情况&#xff0c;对药企来说可以根据同类药品市场价格指导自产药品的定价&#xff0c;对其它机构来说了解药品价格可以帮助选择价格合理的药品供应商&#xff0c;降低…

upload-labs关卡10(点和空格绕过)通关思路

文章目录 前言一、回顾前几关知识点二、靶场第十关通关思路1、看源代码2、bp抓包绕过3、检查文件是否成功上传 总结 前言 此文章只用于学习和反思巩固文件上传漏洞知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚未授权的网站做渗透测…

轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码

轻松搭建短域名短链接服务系统&#xff0c;可选权限认证&#xff0c;并自动生成证书认证把nginx的http访问转换为https加密访问&#xff0c;完整步骤和代码。 在互联网信息爆炸的时代&#xff0c;网址复杂而冗长&#xff0c;很难在口头告知他人&#xff0c;也难以分享到社交媒体…

快速搭建本地的chatgpt

快速搭建本地的chatgpt 参考&#xff1a;一篇文章教你使用Docker本地化部署Chatgpt&#xff08;非api&#xff0c;速度非常快&#xff01;&#xff01;&#xff01;&#xff09;及裸连GPT的方式&#xff08;告别镜像GPT&#xff09;-CSDN博客 前提是linux下 已安装docker 命…