赞
踩
- # 重复值处理
- import pandas as pd
- data = pd.DataFrame([[1,2,3],[1,2,3],[4,5,6]],columns=['c1','c2','c3'])
- data
- # 1、2行是重复的,使用duplicated()查询重复得内容
- print(data[data.duplicated()])
- # 计算重复得数量
- print(data.duplicated().sum())
- # 删除重复的行
- data1 = data.drop_duplicates()
- data1
- # 指定变量判断是否删除
- print(data.drop_duplicates(subset=['c1','c3'],keep='first',inplace=False))
- # first保留第一个,inplace=True对原始数据修改
- # 注意上面删除了重复得行之后,并没有改变原表的结构,所以drop_duplicates()函数并不会改变原表的结构,
- # 所以需要重新赋值,或者在其中设置inplace = True
- # 1.2缺失值处理
- import numpy as np
- import pandas as pd
- data1 = pd.DataFrame([[1,np.nan,3],
- [np.nan,2,np.nan],
- [1,np.nan,0]],columns=['c1','c2','c3'])
- data1
- # 可以使用isnull()函数或者isna()函数来查看空值
- print(data1.isnull())
- data1.isna()
- # 各变量中缺失值的数量
- data1.isnull().sum(axis=0)
- # 对单列查看空值
- data1['c1'].isnull()
- # 如果数据量较大,可以通过如下代码筛选出某列中内容为空值的行
- data1[data1['c1'].isnull()]
- # 对于空值的处理方式有两种,一种是删除空值,一种是填补空值
- # 删除空值
- a = data1.dropna()
- a
- # 也可以对上述函数设置thresh参数,例如将其设置为n,表示如果一行中的非空值少于n个则保留该行
- a1 = data1.dropna(thresh=2)
- a1
- # 用fillna()填补空值
- # 定义缺失值为0
- data_null_0 = data1.fillna(0,inplace=False)
- print(data_null_0)
- # 用均值填补
- b = data1.fillna(data1.mean())
- print(b)
- # 用中位数填补
- c = data1.fillna(data1.median())
- print(c)
- # 用空值上方或下方的值替换空值
- d = data1.fillna(method='pad') # pad表示用上方值替换,如果上方不存在或者也是空值,则布替换
- print(d)
- # 用下方值替换
- e = data1.fillna(method='backfill')
- print(e)
- # 异常值处理
- import numpy as np
- import pandas as pd
- data2 = pd.DataFrame({'c1':[3,10,5,7,1,9,69],
- 'c2':[15,16,14,100,19,11,8],
- 'c3':[20,15,18,21,120,27,29]},columns=['c1','c2','c3'])
- data2
- # 利用箱体图和标准差来进行异常值检验
- import matplotlib.pyplot as plt
- plt.grid(True)
- plt.boxplot(data2,labels=['c1','c2','c3'],flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 10})
# 筛选异常值(IQR) """ 优点:简单、可解释性强 缺点:鲁棒性差,准确性差,只能剔除明显的异常值 """ # 算出上届和下界 q1 = data2.quantile(0.25) q3 = data2.quantile(0.75) iqr = q3 - q1 bottom = q1 -1.5*iqr # 下界 upper = q3 + 1.5*iqr # 上界 print(bottom) print(upper) # 筛选异常值 error = data2[(data2 < bottom) | (data2 > upper)] print(error) data = data2[(data2 >= bottom) & (data2 <= upper)] print('异常值共%i条'%len(error)) data
- """
- 利用标准差检查,当数据服从标准正态分布时,99.7%的数值距离均值3倍sigma之内,
- 95.4%的数值距离均值2倍sigma之内,
- 在3倍sigma之外的值可以认为是异常值,也可以将阈值设置为两个标准差
- """
- import numpy as np
- import pandas as pd
- data2 = pd.DataFrame({'c1':[3,10,5,7,1,9,69],
- 'c2':[15,16,14,100,19,11,8],
- 'c3':[20,15,18,21,120,27,29]},columns=['c1','c2','c3'])
- data2
- # 判断是否符合正态分布,pvalue大于0.05则认为数据呈正态分布
- from scipy import stats
- mean = data2['c1'].mean()
- std = data2['c1'].std()
- print(stats.kstest(data2['c1'],'norm',(mean,std))) # 呈正态分布
- columns = ['c1','c2','c3']
- for i in columns:
- mean = data2[i].mean()
- std = data2[i].std()
- print(stats.kstest(data2[i],'norm',(mean,std)))
- f = pd.DataFrame()
- for i in data2.columns:
- z = (data2[i]-data2[i].mean())/data2[i].std() # 标准化
- f[i] = abs(z)>2 # abs计算绝对值
- f
- # 如何处理异常值
- """
- 1、删除含异常值的记录
- 2、将异常值视为缺失值
- 3、数据分箱的方法进行处理
- 4、插补法
- 5、不处理
- """
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。