使用pandas进行数据清洗

本文介绍了在数据预处理阶段如何清洗原始数据中的噪点数据,包括清洗空值(如删除、填充)、处理重复值以及识别并可能采取措施处理异常值。主要讨论了使用Pandas库的函数如dropna和duplicated,以及标准差法和MAD法进行异常值检测的方法。
摘要由CSDN通过智能技术生成
  • 采集到原始的数据中会存在一些噪点数据,噪点数据是对分析无意义或者对分析起到偏执作用的数据。
  • 如何清洗:
    • 清洗空值/缺失值
    • 清洗重复值
    • 清洗异常值

import pandas as pd
from pandas import DataFrame,Series
import numpy as np

pandas处理空值操作

  • isnull
  • notnull
  • any
  • all
  • dropna
  • fillna

df = DataFrame(data=np.random.randint(0,100,size=(7,5)))
df.iloc[0,3] = np.nan
df.iloc[3,3] = None
df.iloc[2,2] = np.nan
df.iloc[5,3] = np.nan
df
在这里插入图片描述

  • 缺失值的处理方案:

    • 1.可以将空值对应的行/列进行删除
    • 2.可以将空值进行填充
  • 将空值对应的行进行删除

ret = df.isnull() #可以通过isnull判断df中是否存在空数据
ret
在这里插入图片描述

#监测ret中哪些行存在True(表示df中哪些行存在空值)
ex = ret.any(axis=1) #axis=1表示轴向为行
#any可以对ret表格中的行进行是否存在True的判定,如果存在True,则给该行返回一个True,否则返回False
ex
在这里插入图片描述

#整合后的结果;在df中True对应的行是存在空值
ex = df.isnull().any(axis=1)
ex
在这里插入图片描述

ex = df.notnull().all(axis=1) #all判断每一行中是否全部为True,如果全部为True,则给该行返回True,否则返回False
ex
在这里插入图片描述

df.loc[ex] #一般可以将notall->all返回的结果作为df的行索引,过滤空对应的行数据
在这里插入图片描述

#更简单的过滤空对应的行数据的方式
df.dropna(axis=0) #注意在dropna中的轴向0表示行,1表示列
在这里插入图片描述

#需求:知道df中每一列存在空值的个数/占比
for col in df.columns:
#col表示df的某一列的列索引
#判断列中是否存在空值
if df[col].isnull().sum() > 0:
#计算空值占比
p = df[col].isnull().sum() / df[col].size
#将p小数转换成百分比显示
p = format(p,‘.2%’) #.2%表示将p转换成保留2位小数的百分数
print(col,‘列中存在的空值的占比为:’,p)
在这里插入图片描述

  • 将空值进行填充

#使用任意值对空值进行填充
df.fillna(value=666) #将df中所有的空值填充为666
在这里插入图片描述

#使用有意义的数据对空值进行填充(近邻值)
df.fillna(method=‘bfill’,axis=0) #在竖直方向上选择空后面的元素填充空值
#method填充方式:ffill(向前填充)和bfill(向后填充)
在这里插入图片描述

#使用有意义的数据对空值进行填充(统计值)
#使用列的均值填充列的空值
for col in df.columns:
if df[col].isnull().sum() > 0:
mean_value = df[col].mean()
df[col].fillna(value=mean_value,inplace=True)
df
在这里插入图片描述

  • 注意:实现空值的清洗最好选择删除的方式,如果删除的成本比较高,再选择填充的方式。

处理重复数据

  • 基于duplicated和drop进行删除重复行操作

df = DataFrame(data=np.random.randint(0,100,size=(8,5)))
df.iloc[3] = [0,0,0,0,0]
df.iloc[5] = [0,0,0,0,0]
df.iloc[7] = [0,0,0,0,0]
df
在这里插入图片描述

#如何监测数据中是否存在重复的行数据
df.duplicated() #可以监测原始数据中哪些行是重复,重复则返回True,否则返回False
在这里插入图片描述

df.duplicated().sum() #说明df这组数据中有2行重复的行数据
2
df.drop_duplicates(inplace=True) #直接删除数据中重复的行数据
df
在这里插入图片描述

处理异常/离群数据

异常值是分析师和数据科学家常用的术语,因为它需要密切注意,否则可能导致错误的估计。简单来说,异常值是一个观察值,远远超出了样本中的整体模式。

异常值在统计学上的全称是疑似异常值,也称作离群点(outlier),异常值的分析也称作离群点分析。异常值是值样本中出现的’极端值’,数据值看起来异常大或异常小,其分布明显偏离其余的观测值。异常分析是检验数据中是否存在不合常理的数据,在数据分析中,既不能忽视异常值的存在,也不能简单地把异常值从数据分析中剔除。重视异常值的出现,分析其产生的原因,常常成为发现新问题进而改进决策的契机。

举个例子,做客户分析,发现客户的年平均收入是80万美元。但是,有两个客户的年收入是4美元和420万美元。这两个客户的年收入明显不同于其他人,那这两个观察结果将被视为异常值。

  • 给定条件的异常数据处理
    • 自定义一个1000行3列(A,B,C)取值范围为0-1的数据源,然后将C列中的值大于其两倍标准差的异常值进行清洗

import pandas as pd
from pandas import DataFrame
import numpy as np

data = DataFrame(data=np.random.random(size=(1000,3)),columns=[‘A’,‘B’,‘C’])
data
在这里插入图片描述

#求出了C列数据的2倍标准差
twice_std = data[‘C’].std() * 2
twice_std
0.5816897093856236
ex = data[‘C’] > twice_std
data.loc[ex] #取出了异常值对应的行数据
在这里插入图片描述

indexs = data.loc[ex].index #取出了异常值对应行数据的行索引
indexs
在这里插入图片描述

data.drop(index=indexs,inplace=True) #在演示数据中将异常值对应的行数据进行清洗
data

  • 标准差法
    • 又称拉依达准则(标准差法),对某些异常数据进行剔除,以提高数据的准确性。
    • 适用场景:
      • 仅局限于对正态或近似正态分布的样本数据处理,且数据量级尽可能大会更加使用。
    • 工作原理:
      • 先假设一组检测数据存在异常数据,对其进行计算处理得到标准偏差σ,然后确定一个区间,认为凡超过这个区间的就是异常数据,则对该数据予以剔除。
      • 标准差本身可以体现因子的离散程度,是基于因子的平均值μ而定的。在离群值的处理过程中,可通过μ ± nσ来衡量因子与平均值的距离(n通常使用3)。
        • 将区间[μ - 3σ,μ + 3σ]的值视为正常值范围,在[μ - 3σ,μ + 3σ]外的值视为离群值。
          在这里插入图片描述

#伪造了一组含有5个异常数据的样本
iris_length = abs(np.random.randn(9999))
#手动添加一些异常数据
iris_length[44] = 54
iris_length[33] = 67
iris_length[22] = 56
iris_length[11] = 87
iris_length[55] = 49
iris_length
在这里插入图片描述

def std_opt(data):
mean_value = data.mean()#均值
std_value = data.std() #标准差
m_min = mean_value - 3 * std_value
m_max = mean_value + 3 * std_value
return m_min,m_max

m_min,m_max = std_opt(iris_length)

for i in iris_length:
if i < m_min or i > m_max:
print(i)
87.0
56.0
67.0
54.0
49.0

  • MAD法
    • 又称为绝对值差中位数法,是一种先需计算所有因子与中位数之间的距离总和来检测离群值的方法,使用大样本数据

    • 公式:设有平稳离散数据X=[x1,x2,…,xn],其数据中位数为X_median:
      在这里插入图片描述

    • 应用场景:

      • 当数据呈对称分布或接近对称分布时MAD和标准差法效果相等或接近相等
      • 当数据为偏态分布,应选择众数或中位数等位置代表值,这时它们的代表性要比均值好。

def median_opt(data):
median = np.median(data)
count = data.size
a = (((data-median)**2).sum()/count)**0.5
m_min = median - 3 * a
m_max = median + 3 * a
return m_min,m_max

median_opt(iris_length)
(-3.9479897059920868, 5.302663263389095)
m_min,m_max = median_opt(iris_length)
for i in iris_length:
if i < m_min or i > m_max:
print(i)
87.0
56.0
67.0
54.0
49.0

  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ak2111

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值