#数据清洗 缺失值 异常值 重复值
import pandas as pd
# 一: 检测与处理缺失值得操作:
data = pd.read_excel('人事终表.xlsx')
# print(data)
#检测是否为空值 1 isnull 判断是空值的方法 是空值返回True 否则为Flase
# 2 notnull 与isnull 返回形式相同
# notnull().sum() 相当于count
# print(data.tail(10).isnull())
#处理空值的方法 填充 fillna
# 参数 values : 填充的参数,填一个字符 就是全部填充(比如 fillna(0),nan全部填充为0)
# 可以填一个字典 ,效果如下:每列nan填的都不相同 inplace = True
# limit 限制多少个 limit= 1 只需改一个
# 删除 dropna
# 参数 axis = 0 或1
# how any all 默认为any
# thresh 阈值 这一行或者这一列 非空值达到阈值 就不删除, 小于阈值才删除
# subset
# 删行 看看那一(几)列是空值 意思是 就根据填的列 来判断是否删除,没传入的列 不用考虑
# print(data.dropna(axis = 0,how = 'any'))
# print(data.dropna(axis = 0,how = 'all'))
# print(data.fillna({'序号': '001','应发数':1000},limit = 1))
# 3 插值法
# (1)线性差值 x y 之间满足线性关系 x 是index y是需要插入的列 y = kx+b
import numpy as np
from scipy.interpolate import interp1d
# pd.DataFrame({'number':[2,4,6,8,12]},
# index=[0,1,2,3,5])
# x = np.array([0,1,2,3,5]) #线性
# y = np.array([2,4,6,8,12])
# Linear1 = interp1d(x,y,kind = 'linear') #拟合只能在限内,超过范围会报错
# print(Linear1([4]))
#非线性 多项式插值的方法:利用已知的值,拟合一个多项式
# 常用的拉格朗日插值 牛顿插值
from scipy.interpolate import lagrange
# x = np.array([0,1,2,3,4,7,8,9])
# y = np.array([2,8,18,32,50,128,162,200])
# lag = lagrange(x,y)
# print(lag([5,6]))
# 总结:用非线性函数拟合线性数据是可以的,但是用线性的函数拟合非线性的数据,结果会很差。
# 如果不知道用哪个,就全用非线性的去拟合
# 二:检测与处理重复值 (检测到直接处理)
# 1.(1):记录重复
df = pd.DataFrame({'name':['lx', 'ss','ws','lx'],
'id':[1, 2, 3, 1],
'age':[12,15, 12, 12]})
print(df.drop_duplicates(subset=['name','id']))
# 根据subjet传入的字段进行判断,一致的删除,不一致的保留
# 2 特征重复
# 特征重复要求是连续数值型,通过相似度的方法来判定两列值是否具有某种关系:(-1,1),如果呈现 1 或-1 的相关性, 则删除
# 注意: 通过相识度去重 只能处理数值型 ,不能处理数值型之外的其他类型。
data[['counts','amounts']].corr(method='kendall') #只看上下三角形
data[['counts','amounts']].corr(method='spearman')
# 3.哑变量处理 因为类别型数据不能记性运算,通过哑变量处理,将类别型数据转化为数值型数据。
# 返回的数据类型是一个稀疏矩阵 只有0 和 1 0 很多
x = data['dishes_name'].head()
pd.get_dummies(x)
# 4 异常值的处理:
# 异常值:异常值是指数据中个别的数值明显偏离其余数值的数据,也成为是离群点(或者叫野值)
# 检测异常值就是检测数据中是否有录入错误以及是够有不合理的数据。
# 3σ原则(拉伊达准则)
# 该法则就是假设一组检测数据只有随机误差,对原始数据就行计算处理得到标准差。并且按照一定的概率确定区间,
# 认为误差超过这个区间就属于异常值,3σ原则仅适用于服从正态分布或者近似正态分布的数据
# u - 3σ < x <u + 3σ 为正常区间,此区间的概率值为0.9973
# 代码:
min_mask = data['amounts'] < data['amounts'].mean() - 3*data['amounts'].std()
max_mask = data['amounts'] > data['amounts'].mean() + 3*data['amounts'].std()
#更常用的是根据项目场景自定义阈值范围:
# zho@###########
#五 连续数据离散化
# 分析一个问题时 ,某些特征是连续的,eg:年龄段:
# 1.等宽法 :只能做到尽力要求区间宽度是一致的,但是落到每个区间内的频数就不能保证一致了
# 用此方法更多的时关注区间的宽度;
#bins 表示的是区间当bins中传入为数值型的时候,表示区间的个数,当bins
# 中传入的为list的时候 是自定义的区间
# pd.cut(data['amounts'],bins = 5).value_counts()
# 自己定义区间:
# bins = [0,25,35,56,179]
# pd.cut(data['amounts'],bins=bins)
# 2.等频发:尽力使得数据能够均匀的落到每个区间
pd.qcut(data['amount'],q=5)
# 六 数据 标准化
# 数据标准化的定义:当样本数据中属性的量纲差别很大的时候,相识度的计算结果就会完全由数值打的属性支配。
# 一:离差标准化:x' = (x-min)/(max-min)
# bug (1) 标准化的这一列值不能全都相同 ,因为分母为0了
# (2)max, min 可能是异常值。标准化不准确
# x'的范围是(0,1)之间
# 二:标准差标准化:x' = (x-u)/σ (u:均值 σ:标准差)
# 标准差标准化之后的数据满足:均值为0,方差为1;(正态分布)
# x' 的范围是 负无穷 到 正无穷
# 三:小数定标标准化: x' = x/10**n
# 通常 x'的范围在(-1,1)之间 取一列中绝对值最大的数 除以 10的几次方 然后向上取整
pandas 数据清洗
最新推荐文章于 2024-01-07 14:53:09 发布