Python数据清洗

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/X_dmword/article/details/88616238

1、缺失值的处理

准备:pandas、numpy、sklearn.preprocessing中的Imputer类

import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer

data = pd.DataFrame(np.random.randn(6, 4), columns=['col1', 'col2', 'col3', 'col4'],
                    index=['a', 'b', 'c', 'd', 'e', 'f'])
## 1
print(data)
# 切片 提取 1:2 左闭右开 增加缺失值 区别loc ix
data.iloc[1:2, 1] = np.nan
data.iloc[4, 3] = np.nan
## 2
print(data)
# 查看缺失值 true即为缺失
nan_all = data.isnull()
## 3
print(nan_all)
# 获得含有na的列
nan_lie = data.isnull().any()
# 获得全部为na的列
nan_lielie = data.isnull().all()
## 4
print(nan_lie)
## 5
print(nan_lielie)

# 直接丢弃缺失值
data2 = data.dropna()

# 使用sklearn将缺失值替换为特定值
# 先建立替换规则,默认均值,还可以是中位数(median)或众数(most_frequent)或
# 四分位数等,axis默认0,使用列做计算逻辑(类似取列的均值)
nan_model = Imputer(missing_values="NaN", strategy='mean', axis=0)
# 应用规则
nan_result = nan_model.fit_transform(data)
## 6
print(nan_result)

# 使用pandas将缺失值替换为特定值
# 用后面的值替换,若要用前面的值替换则是pad
pd1 = data.fillna(method='backfill')
# 用后面的值替换,限制每列只能替换一个缺失值
pd2 = data.fillna(method='bfill', limit=1)
# 用0替换
pd3 = data.fillna(0)
## 7
print(pd3)
# 用不同值替换不同列的缺失值
pd4 = data.fillna({'col2': 1.1, 'col4': 1.2})
# 选择各列的均值替换
# pd5=data.fillna(data.mean()['col2':'col4'])

2、异常值处理

如何判断异常值??

对于有固定业务规则的可以直接套用业务规则,而对没有固定业务规则的,可以采用常见的数学模型判断,例如基于概率分布的模型(如正态分布的标准差范围)、基于聚类的方法(如KMeans)、基于密度的方法(如LOF)基于分类的方法(如KNN)、基于统计的方法(如分位数法)等。

下面先引入一个概念:

标准分数(standard score)也叫z分数(z-score),是一个分数与平均数的差再除以标准差的过程。"一个给定分数距离平均数多少个标准差?"标准分数是一种可以看出某分数在分布中相对位置的方法。标准分数能够真实的反应一个分数距离平均数的相对标准距离。如果我们把每一个分数都转换成标准分数,那么每一个标准分数会以标准差为单位表示一个具体分数到平均数的距离或离差。将成正态分布的数据中的原始分数转换为标准分数,我们就可以通过查阅标准分数在正态曲线下面积的表格来得知平均数与标准分数之间的面积,进而得知原始分数在数据集合中的百分等级。

使用Z标准化得到的阈值作为异常值的判断标准,标准化后的得分超过阈值则为异常值。通常当阈值设定为2时,已经是相对异常的表现值了。

import pandas as pd
data=pd.DataFrame({'col1':[1,120,23,13,5],
                  {'col2':[2,12,45,9,29]})
print(data)
#通过Z方法判断异常值
#复制一个用来存储z得分的数据框
data_zs=data.copy()
#获取列名
cols=data.columns
#循环读取每列,感觉下面都是一列列的算,数组形式??
for col in cols:
    data_col=data[col] #得到每列的值
    z_score=(data_col-data_col.mean())/data_col.std() #计算每列的z得分
    data_zs[col]=z_score.abs()>2.2 #得分大于2.2为异常值
print(data_za)

3、重复值处理

关键点:重复值的判断与如何处理

pandas的duplicated()判断重复值记录

pandas的drop_duplicates()删除数据记录,可指定特定列或全部

numpy中unique()返回所有不同的值,且按照从小到大的顺序

set(),python自带内置函数,也能返回唯一元素的集合

import pandas as pd
data1=['a',1]
data2=['a',1]
data3=['b',2]
data4=['b',2]
data=pd.DataFrame([data1,data2,data3,data4],columns=['col1','col2'])
print(data)
#判断
isduplicated=data.duplicated()
print(isduplicated)
#删除
new_1=data.drop_duplicates()
new_2=data.drop_duplicates(['col1'])
new_3=data.drop_duplicates(['col1','col2'])
print(new_1)
print(new_2)
print(new_3)

猜你喜欢

转载自blog.csdn.net/X_dmword/article/details/88616238