Pandas数据清洗及基本处理

合并数据

堆叠合并数据

1、横向表堆叠
横向堆叠,即将两个表在X轴向拼接在一起,可以使用concat函数完成,
pandas.concat(objs, axis=0, join=‘outer’, join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
Pandas数据清洗及基本处理_第1张图片
Pandas数据清洗及基本处理_第2张图片
axis=1时,concat做行对齐,然后将不同列名称的两张或多张表合并。当两个表索引不完全一样时,可以使用join参数选择是内连接还是外连接。在内连接的情况下,仅仅返回索引重叠部分。在外连接的情况下,则显示索引的并集部分数据,不足的地方则使用空值填补。
当两张表完全一样时,不论join参数取值是inner或者outer,结果都是将两个表完全按照X轴拼接起来。
Pandas数据清洗及基本处理_第3张图片
2、纵向堆叠——concat函数
使用concat函数时,在默认情况下,即axis=0时,concat做列对齐,将不同行索引的两张或多张表纵向合并。在两张表的列名并不完全相同的情况下,join参数取值为inner时,返回的仅仅是列名交集所代表的列,取值为outer时,返回的是两者列名的并集所代表的列
不论join参数取值是inner或者outer,结果都是将两个表完全按照Y轴拼接起来。
Pandas数据清洗及基本处理_第4张图片
3、纵向堆叠——append方法
append方法也可以用于纵向合并两张表。但是append实现纵向表堆叠有一个前提条件,那就是两张表的列名需要完全一致。
pandas.DataFrame.append(self, other, ignore_index=False, verify_integrity=False)
常用参数如下:
Pandas数据清洗及基本处理_第5张图片

主键合并数据

主键合并,即通过一个或多个键将两个数据集的行连接起来,类似于SQL中的JOIN。针对同一个主键存在两张包含不同字段的表,将其根据某几个字段一一对应拼接起来,结果集列数为两个元数据的列数和减去连接键的数量。
Pandas数据清洗及基本处理_第6张图片
1、merge函数
和数据库的join一样,merge函数也有左连接(left)、右连接(right)、内连接(inner)、外连接(outer),但比起数据库SQL语言中的join和merge函数还有其独到之处,例如可以在合并过程中对数据集中的数据进行排序等。
pandas.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=(’_x’, ‘_y’), copy=True, indicator=False)

常用参数及说明:
Pandas数据清洗及基本处理_第7张图片
2、join方法
使用join实现部分主键合并时,两个主键的名字必须相同。
pandas.DataFrame.join(self, other, on=None,how=‘left’,lsuffix=’’, rsuffix=’’, sort=False)
常用参数说明如下:
Pandas数据清洗及基本处理_第8张图片
3、重叠合并数据
若出现两份数据的内容几乎一致的情况,但是某些特征在其中一张表上的完整的,而在另外一张表上的数据则是缺失的时候,可以用combine_first方法进行重叠数据合并,其原理如下:
Pandas数据清洗及基本处理_第9张图片
pandas.DataFrame.combine_first(other),其中other接收DataFrame,表示参与重叠合并的另一个DataFrame,无默认。

清洗数据

检测与处理重复值

1、记录重复
即一个或多个特征某几个记录的值完全相同。
方法一:利用列表list去重,自定义去重函数:

def delRep(list1):
	list2=[]
	for i in list1:
		if i not in list2:
			list2.append(i)
	return list2

方法二:利用集合(set)的元素是唯一的特性去重,如dish_set=set(dishes)

比较上述两种方法可以实现,方法一代码冗长,方法二代码简单了许多,但会导致数据的排列发生改变。
pandas提供了名为drop_duplicates的去重方法。该方法只对DataFrame或者Series类型有效。这种方法不会改变数据原始排列,并且兼具代码简洁和运行稳定的特点。该方法不仅支持单一特征的数据去重,害能够依据DataFrame的其中一个或几个特征进行去重操作。
pandas.DataFrame(Series).drop_duplicates(self, subset=None, keep=‘first’, inplace=False)
Pandas数据清洗及基本处理_第10张图片
2、特征重复
去除连续型特征重复可以利用特征间的相似度将两个相似度为1的特征去除一个。在pandas中相似度的计算方法为corr,使用该方法计算相似度时,默认为“pearson”法,可以通过“method”参数调节,目前还支持“spearman”法和“kendall法”。
但是通过相似度矩阵去重存在一个弊端,只能对数值型重复特征去重,类别型特征之间无法通过计算相似系数来衡量相似度。
除了使用相似度矩阵进行特征去重之外,可以通过DataFrame.equals的方法进行特征去重。

检测与处理缺失值

1、利用isnull或notnull找到缺失值
数据中的某个或某些特征的值是不完整的,这些值称为缺失值。
pandas提供了识别缺失值的方法isnull以及识别非缺失值的方法notnull,这两种方法在使用时返回的都是布尔值True和False。

2、删除法
删除法分为删除观测记录和删除特征两种,它属于利用减少样本量来换取信息完整度的一种方法,是一种最简单的缺失值处理方法。
pandas中删除缺失值的方法dropna:
pandas.DataFrame.dropna(self, axis=0, how=‘any’, thresh=None, subnet=None, inplace=False)

常用参数及说明:
Pandas数据清洗及基本处理_第11张图片
3、替换法
特征可分为数值型和类别型。缺失值所在特征为数值型时,通常利用其均值、中位数和众数等描述其集中趋势的统计量来代替缺失值;为类别型时,则选择使用众数来替换缺失值。
pandas.DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None)
常用参数及说明如下:
Pandas数据清洗及基本处理_第12张图片
4、插值法
删除法简单易行,但是会引起数据结构变动,样本减少,替换法使用难度较低,但是会影响数据的标准差,导致信息量变动。在面对数据缺失问题时,除了这两种方法之外,还有一种常用的方法一插值法。
常用的插值法有线性插值、多项式插值和样条插值等:
线性插值是一种较为简单的插值方法,它针对已知的值求出线性方程,通过求解线性方程得到缺失值。
多项式插值是利用已知的值拟合一个多项式,使得现有的数据满足这个多项式,再利用这个多项式求解缺失值,常见的多项式插值法有拉格朗日插值和牛顿插值等。
样条插值是以可变样条来作出一条经过一系列点的光滑曲线的插值方法,插值样条由一些多项式组成,每一个多项式都是由相邻两个数据点决定,这样可以保证两个相邻多项式及其导数在连接处连续。
从拟合结果可以看出多项式插值和样条插值在两种情况下拟合都非常出色,线性插值法只在自变量和因变量为线性关系的情况下拟合才较为出色。
在实际分析过程中,自变量与因变量的关系是线性的情况非常少见。所以在大多数情况下,多项式插值和样条插值是较为合适的选择
SciPy库中的interpolate模块除了提供常规的插值法外,还提供了例如在图形学具有重要作用的重心坐标插值等。

检测与处理异常值

异常值:数据中个别值的数值明显偏离其余的数值,有时也称为离群点。
检测异常值就是检验是否有录入错误以及是否含有不合理的数据。
常用的异常值检测方法有两种:3σ原则箱线图分析

3σ原则

又称拉依达法则。该法则就是先假设一组检测数据只含有随机误差,对原始数据进行计算处理得到标准差,然后按一定的概率确定一个区间,认为误差超过这个区间的就属于异常值。
仅适用于对正态或近似正态分布的样本数据处理,σ代表标准差,μ代表均值,x=μ为图形的对称轴。
数据的数值分布几乎全部集中在区间(μ-3σ,μ+3σ)内,超出这个范围的数据仅占不到0.3%,故根据小概率原理,可以认为超出3σ的部分数据为异常数据。
Pandas数据清洗及基本处理_第13张图片

箱线图分析

箱线图提供了识别异常值的一个标准,即异常值通常被定义为小于QL-1.5IQR或大于QL+1.5IQR的值。
QL称为下四分位数,表示全部观察值中有四分之一的数据取值比它小。
QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它大。
IQR称为四分位数间距,是上四分位数QU与下四分位数QL之差,其间包含了全部观察值的一半。

四分位数给出了数据分布的中心、散步和形状的某种指示,具有一定的鲁棒性,即25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值通常不能对这个标准施加影响。鉴于此,箱线图识别异常值的结果比较客观,因此在识别异常值方面具有一定的优越性。

向量化计算

  • 计算新价格
    df[‘总价’] * 10000
  • 使用Numpy计算新价格
    import numpy as np
    np.sqrt(df[‘总价’])
  • 合并两字符串
    df[‘朝向’] + df[‘户型’]
  • 将新计算的均价存入Data Frame
    df[‘均价’] = df[‘总价’]*10000 / df[‘建筑面积’]
  • Map 将函数套用到Series上的每个元素
    实例①:移出物业费中的元
def removeDollar(e):
	return e.split('元')[0]

df['物业费'].map(removeDollar)

②使用匿名函式
df[‘物业费’].map(Lambda e: e.split(‘元’)[0])

  • Apply 将函数套用到DataFrame上的行与列
    Pandas数据清洗及基本处理_第14张图片

  • ApplyMap 将函式套用到DataFrame上的每个元素(elementwise)
    将所有暂无资料的元素替代成缺失值(NaN)

import numpy as np
df.applymap(lambda e:np.nan if e=='暂无资料' else e)

处理时间格式资料

  • 打印出现在时间
    from datetime import datetime
    current_time = datetime.now()
  • 将时间转换成字串
    current_time.strftime(’%Y-%m-%d’)
  • 将字符串转换为时间
    datetime.strptime(‘2017-04-21’, ‘%Y-%m-%d’)

时间回溯

  • 往前回溯一天
    from datetime import timedelta
    current_time - timedelta(days = 1)
  • 往前回溯10天
for i in range(1,10):
	dt=current_time - timedelta(days = i)
	print(dt.strftime('%Y-%m-%d'))

转换UNIX时间

  • 将datetime 转换为UNIX timestamp
    from time import mktime
    mktime(current_time.timetuple())
  • 将UNIX timestamp转换为datetime
    datetime.fromtimestamp(1492859823)

在pandas转换时间

import pandas
df[‘张贴时间’] = pandas.to_datetime(df[‘张贴日期’], format= ‘西元%Y年%m月%d日’)

虚拟变量

  • 建立虚拟变量
    pandas.get_dummies(df[‘朝向’])
  • 合并虚拟变量与原DataFrame
    df=pandas.concat([df,pandas.get_dummies(df[‘朝向’])], axis=1)
  • 舍弃原有字段
    df.drop(‘朝向’, axis=1)

建立透视表

df2=df.pivot_table(index=‘张贴日期’, columns=‘产权性质’, values=‘总价’, aggfunc=sum)
df2.head()

df3 = df.pivot_table(index=‘产权性质’, columns=‘张贴日期’, values=‘总价’, aggfunc=sum)
df3.head()
df3也可以用df2.T做转置。

长宽表格转换(stack&unstack)

  • 建立多索引的透视表
    df multi idx = df.pivot table(index=[‘楼层’, ‘装修’], columns=‘张贴日期’, values=‘总价’, aggfunc=sum)
  • 转换为宽表格
    df_wide=df_multi_idx.unstack()
    df_wide.head()
  • 转换为长表格
    df_long=df_wide.stack()
    df_long.head()

正则表达式

Pandas数据清洗及基本处理_第15张图片
Pandas数据清洗及基本处理_第16张图片
范例:

import re
m=re.match(r"(\w+)@(\w+)", "[email protected]")
print(m.groups())
#('david', 'largidata')

m=re.match(r"(\w+)@([a-z.]+)", "[email protected]")
print(m.groups())
#('david', 'largidata.com')

m=re.match(r"(\d+)\.(\d+)", "1999.5")
print(m.groups())
#('David', 'Chiu') Chiu


str1='scp file.txt [email protected]:./'
m=re.match('^scp ([\w\.]+) (\w+)@([\w\.]+):(.+)',str1)
if m:
    print(m.group(1),m.group(2),m.group(3),m.group(4))
#file.txt root 10.0.0.1 ./

标准化数据

离差标准化数据

离差标准化是对原始数据的一种线性变换,结果是将原始数据的数值映射到[0,1]区间之间,转换公式为:
在这里插入图片描述
其中max:样本数据最大值,min:样本数据的最小值,max-min:极差。离差标准化保留了原始数据值之间的联系,是消除量纲和数据取值范围影响最简单的方法。

特点

  1. 数据的整体分布情况并不会随离差标准化而发生改变,原先取值较大的数据,在做完离差标准化后的值依旧较大。
  2. 当数据和最小值相等的时候,通过离差标准化可以发现数据变为0 。
  3. 若数据极差过大就会出现数据在离差标准化后数据之间的差值非常小的情况。
  4. 同时,还可以看出离差标准化的缺点:若数据集中某个数值很大,则离差标准化的值就会接近于0,并且相互之间差别不大。若将来遇到超过目前属性[min,max]取值范围的时候,会引起系统出错,这时便需要重新确定min和 max 。

标准差标准化数据

标准差标准化也叫零均值标准化或分数标准化,是当前使用最广泛的数据标准化方法。经过处理后的数据均值为0,标准差为1,转化公式如下:
在这里插入图片描述
δ:原始数据的标准差,标准差标准后的值区间不局限于[0,1],并且存在负值。标准差标准化和离差标准化一样不会改变数据的分布情况。

小数定标标准化公式及对比

通过移动数据的小数位数,将数据映射到区间[-1,1]之间,移动的小数位数取决于数据绝对值的最大值。转化公式如下:
在这里插入图片描述
总之,三种标准化方法各有其优势:

  • 离差标准化方法简单,便于理解,标准化后的数据限定在[0,1]区间内。
  • 标准差标准化受到数据分布的影响较小。
  • 小数定标标准化方法的适用范围广,并且受到数据分布的影响较小,相比较于前两种方法而言该方法适用程度适中。

转换数据

哑变量处理类别数据

数据分析模型中有相当一部分的算法模型都要求输入的特征为数值型,但实际数据中特征的类型不一定只有数值型,还会存在相当一部分的类别型这部分的特征需要经过哑变量处理才可以放入模型之中
哑变量处理的原理示例:
Pandas数据清洗及基本处理_第17张图片

  • get_dummies函数
    pandas.get_dummies(data, prefix=None, prefix_sep=’_’, dummy_na=False, columns=None, sparse=False, drop_first=False)
    Pandas数据清洗及基本处理_第18张图片
    特点:
  • 对于一个类别型特征,若其取值有m个,则经过哑变量处理后就变成了m个二元特征,并且这些特征互斥,每次只有一个激活,这使得数据变得稀疏。
  • 在一定程度上起到了扩充特征的作用。由于数据变成了稀疏矩阵的形式,因此也加速了算法模型的运算速度。

离散化连续型数据

离散化

某些模型算法,特别是某些分类算法如ID3决策树算法和Apriori算法等,要求数据是离散的,此时就要将连续型特征(数值型)变换成离散型特征(类别型)。
离散化就是在数据的取值范围内设定若干个离散的划分点,将取值范围划分为一些离散化的区间,最后用不同的符号或整数值代表落在每个子区间中的数据值。
因此离散化涉及两个子任务,即确定分类数以及如何将连续型数据映射到这些类别型数据上。

Pandas数据清洗及基本处理_第19张图片

1. 等宽法

将数据的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定或者用户指定,与制作频率分布表类似。
pandas提供了cut函数,可以进行连续型数据的等宽离散化,其基础语法格式如下:
pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)
Pandas数据清洗及基本处理_第20张图片
使用等宽法离散化的缺陷为:
等宽法离散化对数据分布具有较高要求,若数据分布不均匀,那么各个类的数目也会变得非常不均匀。

2. 等频法

cut函数虽然不能直接实现等频离散化,但是可以通过定义将相同数量的记录放进每个区间。
等频法离散化的方法相比较于等宽法离散化而言,避免了类分布不均匀的问题,但同时却也有可能将数值非常接近的两个值分到不同的区间以满足每个区间中固定的数据个数。

3. 基于聚类分析的方法

一维聚类的方法包括两个步骤:

  • 将连续型数据用聚类算法(如K-Means算法等)进行聚类。
  • 处理聚类得到的簇,将合并到一个簇的连续型数据做同一标记。

聚类分析的离散化方法需要用户指定簇的个数,用来决定产生的区间数。
k-Means聚类分析的离散化方法可以很好地根据现有特征的数据分布状况进行聚类,但是由于k-Means算法本身的缺陷,用该方法进行离散化时依旧需要指定离散化后类别的数目。此时需要配合聚类算法评价方法,找出最优的聚类簇数目。

你可能感兴趣的:(python,pandas)