当前位置:   article > 正文

重复值、异常值、缺失值处理_data.duplicated()

data.duplicated()

在数据的录入和处理过程中,不可避免会产生重复值、缺失值及异常值

1、重复值处理

  1. # 重复值处理
  2. import pandas as pd
  3. data = pd.DataFrame([[1,2,3],[1,2,3],[4,5,6]],columns=['c1','c2','c3'])
  4. data

1.1 直接删除

  1. # 1、2行是重复的,使用duplicated()查询重复得内容
  2. print(data[data.duplicated()])
  3. # 计算重复得数量
  4. print(data.duplicated().sum())
  5. # 删除重复的行
  6. data1 = data.drop_duplicates()
  7. data1

1.2 指定变量判断是否删除

  1. # 指定变量判断是否删除
  2. print(data.drop_duplicates(subset=['c1','c3'],keep='first',inplace=False))
  3. # first保留第一个,inplace=True对原始数据修改
  4. # 注意上面删除了重复得行之后,并没有改变原表的结构,所以drop_duplicates()函数并不会改变原表的结构,
  5. # 所以需要重新赋值,或者在其中设置inplace = True

2、缺失值处理

  1. # 1.2缺失值处理
  2. import numpy as np
  3. import pandas as pd
  4. data1 = pd.DataFrame([[1,np.nan,3],
  5. [np.nan,2,np.nan],
  6. [1,np.nan,0]],columns=['c1','c2','c3'])
  7. data1
  1. # 可以使用isnull()函数或者isna()函数来查看空值
  2. print(data1.isnull())
  3. data1.isna()
  1. # 各变量中缺失值的数量
  2. data1.isnull().sum(axis=0)
  1. # 对单列查看空值
  2. data1['c1'].isnull()
  1. # 如果数据量较大,可以通过如下代码筛选出某列中内容为空值的行
  2. data1[data1['c1'].isnull()]
  1. # 对于空值的处理方式有两种,一种是删除空值,一种是填补空值
  2. # 删除空值
  3. a = data1.dropna()
  4. a
  1. # 也可以对上述函数设置thresh参数,例如将其设置为n,表示如果一行中的非空值少于n个则保留该行
  2. a1 = data1.dropna(thresh=2)
  3. a1

2.1 用0填补缺失值

  1. # 用fillna()填补空值
  2. # 定义缺失值为0
  3. data_null_0 = data1.fillna(0,inplace=False)
  4. print(data_null_0)

2.2 用均值填补

  1. # 用均值填补
  2. b = data1.fillna(data1.mean())
  3. print(b)

2.3 用中位数填补

  1. # 用中位数填补
  2. c = data1.fillna(data1.median())
  3. print(c)

2.4 用空值上方或者下方的值替换

  1. # 用空值上方或下方的值替换空值
  2. d = data1.fillna(method='pad') # pad表示用上方值替换,如果上方不存在或者也是空值,则布替换
  3. print(d)
  1. # 用下方值替换
  2. e = data1.fillna(method='backfill')
  3. print(e)

3、异常值处理

  1. # 异常值处理
  2. import numpy as np
  3. import pandas as pd
  4. data2 = pd.DataFrame({'c1':[3,10,5,7,1,9,69],
  5. 'c2':[15,16,14,100,19,11,8],
  6. 'c3':[20,15,18,21,120,27,29]},columns=['c1','c2','c3'])
  7. data2

3.1 利用箱体图检验异常值

  1. # 利用箱体图和标准差来进行异常值检验
  2. import matplotlib.pyplot as plt
  3. plt.grid(True)
  4. plt.boxplot(data2,labels=['c1','c2','c3'],flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 10})

3.2 IQR筛选异常值

  1. # 筛选异常值(IQR)
  2. """
  3. 优点:简单、可解释性强
  4. 缺点:鲁棒性差,准确性差,只能剔除明显的异常值
  5. """
  6. # 算出上届和下界
  7. q1 = data2.quantile(0.25)
  8. q3 = data2.quantile(0.75)
  9. iqr = q3 - q1
  10. bottom = q1 -1.5*iqr # 下界
  11. upper = q3 + 1.5*iqr # 上界
  12. print(bottom)
  13. print(upper)
  14. # 筛选异常值
  15. error = data2[(data2 < bottom) | (data2 > upper)]
  16. print(error)
  17. data = data2[(data2 >= bottom) & (data2 <= upper)]
  18. print('异常值共%i条'%len(error))
  19. data

3.3 利用标准差检验异常值

  1. """
  2. 利用标准差检查,当数据服从标准正态分布时,99.7%的数值距离均值3倍sigma之内,
  3. 95.4%的数值距离均值2倍sigma之内,
  4. 在3倍sigma之外的值可以认为是异常值,也可以将阈值设置为两个标准差
  5. """
  6. import numpy as np
  7. import pandas as pd
  8. data2 = pd.DataFrame({'c1':[3,10,5,7,1,9,69],
  9. 'c2':[15,16,14,100,19,11,8],
  10. 'c3':[20,15,18,21,120,27,29]},columns=['c1','c2','c3'])
  11. data2
  1. # 判断是否符合正态分布,pvalue大于0.05则认为数据呈正态分布
  2. from scipy import stats
  3. mean = data2['c1'].mean()
  4. std = data2['c1'].std()
  5. print(stats.kstest(data2['c1'],'norm',(mean,std))) # 呈正态分布
  1. columns = ['c1','c2','c3']
  2. for i in columns:
  3. mean = data2[i].mean()
  4. std = data2[i].std()
  5. print(stats.kstest(data2[i],'norm',(mean,std)))
  1. f = pd.DataFrame()
  2. for i in data2.columns:
  3. z = (data2[i]-data2[i].mean())/data2[i].std() # 标准化
  4. f[i] = abs(z)>2 # abs计算绝对值
  5. f
  1. # 如何处理异常值
  2. """
  3. 1、删除含异常值的记录
  4. 2、将异常值视为缺失值
  5. 3、数据分箱的方法进行处理
  6. 4、插补法
  7. 5、不处理
  8. """

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号