Pandas数据预处理_持续更新

一、数据清洗

1.1 字符串数据分列

# 左分列
pd.Series().str.split(pat = None,n = -1,expand = False''' 
	pat -> str,要拆分的字符串或正则表达式,例如:'-'。默认拆分空格。
	n -> int,默认-1;限制输出中的分割数。None,0和-1解释为返回所有拆分。【就是当用于分列的依据符号在有多个的话需要指定分列的次数(不指定的话就会根据符号有几个分列几次)】
	expand -> bool,默认为False;将拆分的字符串展开为单独的列。 
	     True:返回DataFrame / MultiIndex;
	     False:返回包含字符串列表的Series / Index。
'''
# 右分列
rsplit()处理方式一样,看一下帮助函数文档填参数就行

1.2 Series提取字符串部分元素

当我们向要Series中字符串类型的某一部分,可以通过写正则表达式将其匹配出来。
Ⅰ、Python常用正则表达式链接…
Ⅱ、Python常用正则表达式链接…

pd.Series().str.extract()
'''
	pat -> str 正则表达式
	flags -> int, 匹配规则,如忽略大小写,跨行匹配,默认0
	expand -> bool, 是否将结果展开成DataFrame类型
'''
pd.Series().str.extractall()
'''
	以组的形式进行返回,多个结果是以match作为索引放置。
	pat -> str 正则表达式
	flags -> int, 匹配规则,如忽略大小写,跨行匹配,默认0
'''

1.3 Series替换\删除字符串部分元素

当我们向要Series中字符串类型的某一部分,可以通过写正则表达式将其不需要的部分匹配出来,然后替换掉(如果是要删除则new参数为空字符串就行)。
Ⅰ、Python常用正则表达式链接…
Ⅱ、Python常用正则表达式链接…

pd.Series().str.replace(old, new[, max])
'''
	old -> 将被替换的子字符串。
	new -> 新字符串,用于替换old子字符串。
	max -> 可选字符串, 替换不超过 max 次
	return -> 返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次。
'''

1.4 重复值处理

  1. 数据清洗一般先从重复值和缺失值开始处理
  2. 重复值一般采取删除法来处理 ,首先处理完全重复的数据
  3. 再根据实际情况对部分数据进行去重(有些重复值不能删除)
''' -------- 去重第一步--------
	查看数据是否重复,去掉完全重复的数据
'''
print('数据集是否存在重复观测: \n', any(数据框.duplicated()))
# 计算重复数量
np.sum(数据框.duplicated())
# 查看那些数据重复
数据框[数据框.duplicated()]
# 删除所有变量都重复的行
数据框.drop_duplicates()

''' -------- 去重第二步--------
	根据实际情况,针对部分数据进行去重
'''
数据框.drop_duplicates(subset=['列名_1', ' 列名_2', '列名_3', ' 列名_4'], inplace=True)

1.5 缺失值处理

  1. 缺失值首先需要根据实际情况定义
  2. 可以采取直接删除法
  3. 有时候需要使用替换法或者插值法
  4. 常用的替换法有均值替换、前向、后向替换和常数替换
''' -------- 缺失值处理第一步--------
	统计数据缺失程度
'''
# 每列缺失比例
数据框.apply(lambda x: str(round(sum(x.isnull())/len(x)*100,2))+'%' , axis= 0)

# 删除处理
# 1代表列,O代表行,any是只要有缺失,就删除这一行,基于三个变量(默认是全部列) 
数据框.dropna(axis=0, how='any', subset=['列_1','列_2', '列_3'])

''' -------- 缺失值处理第二步--------
	选择合理的方式对数据进行处理
'''
# 指定值填充
数据框/某列.fillna(指定值)
# 均值填充
某列.fillna(某列.mean())
# 中位数填充
某列.fillna(某列.median())
# 众数填充
某列.fillna(某列.mode()[0])
# 指定多列同时填充
数据框.fillna(value = {'第一列_众数' :某列.mode ()[0],'第二列_均值':某列.mean()})

# 向前填补
某列.fillna(method='ffill')
# 向后填补
某列.fillna(method='bfill')

# -----------------插值法---------------
待补充
# -----------------算法法---------------
待补充

1.6 异常值处理

''' -------- 异常值处理第一步--------
	异常值检测
'''
# 画图观察数据
import matplotlib.pyplot as plt
plt.style.use(' seaborn')

某列.plot(kind = 'hist', bins= 30, density= True) # 绘制直方图
某列.plot(kind = 'kde') # 绘制核密度图
plt.show()

# 箱线图
某列.plot(kind = 'box')

# 方法一 -> 标准差法
x_bar = 某列.mean()
x_std = 某列.std()
print('标准差法异常值上限检测:\n', any(某列 > x_bar + 2.5 * x_std))
print('标准差法异常值下限检测:\n', any(某列 < x_bar - 2.5 * x_std))

# 方法二 -> 箱线图法
Q1 = 某列.quantile(q = 0.25)
Q3 = 某列.quantile(q = 0.75)
IQR = Q3 - Q1
print('箱线图法异常值上限检测:\n', any(某列 > Q3 + 1.5 * IQR))
print('箱线图法异常值下限检测:\n', any(某列 < Q1 - 1.5 * IQR))

''' -------- 异常值处理第二步--------
	选择合理的方式对数据进行处理
'''
筛选出异常值替换掉就OK

1.7数据合并

在这里插入代码片

1.7 Pandas更多技巧

1.x.1 str

  1. Pandas中提供了字符串的函数,但只能对字符型变量进行使用;
  2. 通过str方法访问相关属性 ;
  3. 可以使用字符串的相关方法进行数据处理;

图片来源>>幸福的小猴子qiqi

在这里插入图片描述

1.x.2 dt

  1. Pandas中提供了处理时间的接口;
  2. 通过dt方法访问相关属性 ;
属性名称作用
year返回四位的年
month返回月份,int类型
day日,int类型
hour小时,int类型
minuter分钟,int类型
second秒,int类型
dayofweek一周中的星期几,0代表星期一,6代表星期天
weekofyear一年中的第几周
dayofyear一年中的第几天
quarter一年中的第几个季度

二、数据集成

三、数据规约

四、数据变换

4.1 规范化处理

4.2 离散化处理

  1. 数据离散化就是分箱
  2. 一般常用分箱方法是等频分箱或者等宽分箱
  3. 一般使用pd.cut或者pd.qcut函数
pd.Series().cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
'''
	x -> 类array对象,且必须为一维,待切割的原形式
	bins -> 整数、序列尺度、或间隔索引。如果bins是一个整数,它定义了x宽度范围内的等宽面元数量,但是在这种情况下,x的范围在每个边上被延长1%,以保证包括x的最小值或最大值。如果bin是序列,它定义了允许非均匀bin宽度的bin边缘。在这种情况下没有x的范围的扩展。
	right -> bool。是否是左开右闭区间,right=True,左开右闭right=False,左闭右开
	labels -> 用作结果箱的标签。必须与结果箱相同长度。如果FALSE,只返回整数指标面元。
	retbins -> bool。是否返回面元
	precision -> int。返回面元的小数点几位
	include_lowest -> bool。第一个区间的左端点是否包含
'''
pd.Series().qcut(x, q, labels=None, retbins=False, precision=3, duplicates=raise)
'''
	x -> 类array对象,且必须为一维,待切割的原形式
	q -> 整数或分位数组成的数组。比如 4 代表 按照4分位数 进行切割 
	labels -> 用作结果箱的标签。必须与结果箱相同长度。如果FALSE,只返回整数指标面元。
'''

4.3 稀疏化处理

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值