Pandas数据预处理_持续更新

Pandas数据预处理_持续更新

  • 一、数据清洗
    • 1.1 字符串数据分列
    • 1.2 Series提取字符串部分元素
    • 1.3 Series替换\删除字符串部分元素
    • 1.4 重复值处理
    • 1.5 缺失值处理
    • 1.6 异常值处理
    • 1.7数据合并
    • 1.7 Pandas更多技巧
      • 1.x.1 str
      • 1.x.2 dt
  • 二、数据集成
  • 三、数据规约
  • 四、数据变换
    • 4.1 规范化处理
    • 4.2 离散化处理
    • 4.3 稀疏化处理

一、数据清洗

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

Pandas数据预处理_持续更新_第1张图片

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 稀疏化处理

你可能感兴趣的:(pandas,python,数据分析,数据挖掘)