缺失值分析
数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失,两者都会造成分析结果的不准确。
产生的原因:
- 有些信息暂时无法获取或者获取信息的代价太大
- 有些信息是被遗漏的。
- 属性值不存在。
缺失值的影响:
- 数据挖掘建模将丢失大量的有用信息。
- 数据挖掘模型所表现出的不确定性更加显著,模型中雨涵的规律更难把握。
- 包含空值的数据将使建模过程陷入混乱,导致不可靠的输出。
缺失值处理:
1.删除缺失值:
- data.dropna() #直接删除含有缺失值的行
- data.dropna(axis=1) #直接删除含有缺失值的行
- data.dropna(how = 'all') #删除全是缺失值的行
- data.dropna(thresh = 3) #保留至少有3个非空值的行
- data.dropna(subset = [u'血型']) #判断特定的列,若该列含有缺失值则删除缺失值所在的行
2.插补缺失值
- data.fillna(data.mean()) # 均值插补
- data.fillna(data.median()) #中位数插补
- data.fillna(data.mode()) # 众数插补
- data.fillna(data.max()) #最大值插补
- data.fillna(data.min()) #最小值插补
- data.fillna(5000) # 固定值插补
- data.fillna(method = 'fill') #最近临插补--用缺失值的前一个值填充
- data.fillna(method = 'pad') #最近临插补--用缺失值的前一个值填充
异常值分析
- 简单统计分析,剔除掉不合理的数据。
- 3原则
- 箱型图分析,异常值通常被定义为小于或者大于的值。
异常值处理
将异常值视为缺失值后进行插补。
重复值处理
- 所有列是否重复
查看:print(data.duplicate()))
删除:data.drop_duplicates() - 某一列是否重复
查看:print(data.duplicated('column'))
删除:data.drop_duplicates('column') - 根据多列判断
查看:print(data.duplicated(['col1','col2','col3'])
删除:data.drop_duplicaties(['col1','col2','col3'])
拉格朗日法插补
from scipy.interpolate import lagrange
# 自定义拉格朗日插值函数
# s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s,n,k=5):
y = s[list(range(n-k,n)) + list(range(n,n+1+k))] # 取值
y = y[y.notnull()] # 剔除空值
return lagrange(y.index,list(y))(n)
# 逐个判断元素是否需要插值
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]:
data[i][j] = ployinterp_columns(data[i],j)
数据归一化
最小最大归一化
(data-data.min())/(data.max()-data.min())
零均值归一化
(data-data.mean())/data.std()
小数定标规范化
data/10**np.ceil(log10(data.abs().max())) # np.ceil() 计算大于等于该值的最小整数
连续属性离散化
等宽法
d1 = pd.cut(data,k,labels = range(k)) # k区间数
等频法
w = [1.0*i/k for i in range(k+1)]
w = data.describe(percentiles = w)[4:4+k+1]
w[0] = w[0]*(1-1e-10) #为了包含第一个值
d2 = pd.cut(data,w,labels=range(k))
基于聚类分析的方法
from sklearn.cluster import KMeans
kmodel = KMeans(n_clusters = k,n_jobs = 4)
kmodel.fit(data.reshape((len(data),1)))
c= pd.DataFrame(kmodel.cluster_centers_).sort(0) #输出聚类中心并排序
w = pd.rolling_mean(c,2).iloc[1:] #移动平均第一个值为空值 去除第一个值
w = [0] + list(w[0]) + [data.max()] #加上最大值和最小值,生成一个新的列表
d3 = data.cut(data,w,labels = range(k))
主成分分析降维
#对一个10*4维的随机矩阵进行降维
from sklearn.decomposition import PCA
D = np.random.rand(10,4)
pca = PCA()
pca.fit(D)
pca.components_ # 返回模型的各个特征向量
pca.explained_variance_ratio_ #返回各个成分各自的方差百分比
合并数据
堆叠合并
横向堆叠是指将后一个表的数据堆叠到前一个表的后几列,可以使用 concat 函数完成。
与横向堆叠相对的,纵向堆叠则是指将后一个表的数据堆叠到前一个表的下几行
pd.concat(objs,axis = 0,join = 'outer')
# objs:表示需要合并表的组合[d1,d2],接受多个Series,DataFrame,Panel的组合,无默认。
#axis:默认为0,axis = 0表示做列对齐,列名一致的话,将后表数据添加到前表的下几行(纵向堆叠)。axis = 1表示做行对齐,行标签一致的情况下,将后表的数据添加到前表的后几列(横向堆叠)。
# join:默认为outer,'inner'和'outer'表示取交集和并集。
详细可见:concat函数的常用参数及说明
主键合并
主键合并是指前后两个表按照一个或者多个键匹配的方式连接起来。
pandas库中的 merge 函数和 join 函数都可以实现主键合并。
pd.merge(left,right,how='inner',on=None,left_on=None,right_on = None,left_index=False,right_index=False,sort=False
#left,right:分别表示需要匹配的左表和右表,可接受的对象为DataFrame
#how:表示左右表的连接方式,默认为inner,可以接收的取值为left,right,inner,outer;
# on :表示左右表的连接主键,两个表的主键名称一致时才能使用,不一致时,需要使用使用left_on,right_on等参数,on 参数默认为None,可接收的数据类型为str或sequence。
sort:表示是否对合并后的数据进行排序,默认为False,可接收的数据类型为boolean.
data1.join(data2,on=None,how='inner',sort=sort)
# join 函数与merge 函数 不同之处在于,join 函数要求两个主键的名称必须相同。
详细可见:merge函数的常用参数及说明
重叠合并
数据处理的过程中偶尔出现同样一份数据存储在两张表中,单看两张表的话,哪一张的数据都不算全,但是如果将其中一个表的数据补充进另一张表中,生产的这张新表是相对完整的数据。这种方法叫重叠合并,pandas库中提供了 combine_first的方法来实现这一功能。
data1.combine_first(data2)
参考:《Python数据分析与挖掘实战》
黄小技术包搞分析的博客
网友评论