Pandas数据分析②——数据清洗(重复值/缺失值/异常值)

Pandas系列目录
Pandas数据分析①——数据读取(CSV/TXT/JSON)
Pandas数据分析③——数据规整1(索引和列名调整/数据内容调整/排序)
Pandas数据分析④——数据规整2(数据拼接/透视)
Pandas数据分析⑤——数据分组与函数使用(Groupby/Agg/Apply/mean/sum/count)
Pandas数据分析⑥——数据分析实例(货品送达率与合格率/返修率/拒收率)
Pandas数据分析⑦——数据分析实例2(泰坦尼克号生存率分析)

数据清洗分为三步(文末有大礼赠送):

重复值处理——删除(有几个相同就删除还是全部得相同)
缺失值处理——删除,填充(均值,众数,中位数,前后相邻值),插值(拉格朗日插值,牛顿插值)
异常值处理——describe进行描述性分析+散点图+箱型图定位异常值,处理方法:删除,视为缺失值

一、重复值处理

① 先用duplicated()方法进行逻辑判断,确定是否有重复值

data = pd.read_csv("data.csv",encoding='gbk')
print(data.duplicated().value_counts())    

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》
② 再用duplicates(subset,keep,inplace)方法对某几列下面的重复行删除
subset:以哪几列作为基准列,判断是否重复,如果不写则默认所有列都要重复才算
keep: 保留哪一个,fist-保留首次出现的,last-保留最后出现的,False-重复的一个都不保留,默认为first
inplace: 是否进行替换,最好选择False,保留原始数据,默认也是False

data.drop_duplicates(subset=["订单号","订单行"],keep='first',inplace=True)
print(data.duplicated().value_counts())

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》

二、缺失值处理

1、缺失值查找:
先通过isnull函数看一下是否有空值,结果是有空值的地方显示为True,没有的显示为False;再通过isnull().any()直接看每一列是否有空值,这个是只要这一列有1个空值,结果就是True;如果想具体看哪几行有空值,可以再用data.isnull().values==True来定位

print(data.isnull())

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》

print(data.isnull().any())

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》

print(data[data.isnull().values==True])

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》
2、缺失值处理

① 删除缺失值
dropna(axis,subset,how,thresh,inplace)
axis: 删除行还是列,行是0或index,列是1或column,默认是行
subst: 删除某几列的缺失值,可选,默认为所有列
how: any or all,any表明只要出现1个就删除,all表示所有列均为na才删
thresh: 缺失值的数量标准,达到这个阈值才会删除
inplace: 是否替换

data.dropna(how='any', axis=0,inplace=True)
print(data.isnull().any())

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》
②缺失值填充

fillna(value,method,{},limit,inplace,axis)
value: 可以传入一个字符串或数字替代Na,值可以是指定的或者平均值,众数或中位数等
method: 有ffill(用前一个填充)和bfill(用后一个填充)两种
{}: 可以根据不同的列填充不同的值,列为键,填充值为值
limit: 限定填充的数量
inplace: 是否直接在原文件修改
axis: 填充的方向,默认是0,按行填充

data1 = data[data.isnull().values==True]
print(data1)
print(data1.fillna(0))

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》

print(data1.fillna("missing",limit=1))

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》

print(data1.fillna({"订单号": "下次再补", "数量": "估计"}))

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》

print(data1.fillna(method="ffill"))

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》

data1.fillna(method="bfill",inplace=True)
print(data1)

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》

print(data1.fillna(data1.median()))

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》
③缺失值插值

拉格朗日插值法
在二维坐标系中,如果有N个点,都能找到唯一一个函数经过所有的点,而这个函数的自变量的次数少于或等于N-1**
如何使用?

from scipy.interpolate import lagrange

def ployinterp_column(s, n, k=5):
    y = s[list(range(n - k, n)) + list(range(n + 1, n + 1 + k))]  # 取数
    y = y[y.notnull()]  # 剔除空值
    return lagrange(y.index, list(y))(n)  # 插值并返回插值结果

# 逐个元素判断是否需要插值
for i in data1.columns:
    for j in range(len(data1)):
        if (data1[i].isnull())[j]:  # 如果为空即插值
            data1[i][j] = ployinterp_column(data1[i], j)

三、异常值处理

1、异常值查找:

①先用describe()对统计字段进行描述性分析(仅能进行连续变量的处理),从结果上看,数量和销售金额的标准差接近均值的10倍,结合分位数,25%-75%都是1-4,最大值却达到了1万以上,可见最大值是个异常值,导致均数和方差都变大;同时销售金额最小值为0,这也是异常的

print(data.describe())

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》
②可以画散点图观察,红色圈出部分即是异常值

from matplotlib import pyplot as plt
plt.scatter(data["数量"], data[" 销售金额 "])
plt.show()

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》
③箱型图
四分位距(IQR)就是上四分位与下四分位的差值。而我们通过IQR的1.5倍为标准,规定:超过上四分位+1.5倍IQR距离,或者下四分位-1.5倍IQR距离的点为异常值

plt.subplot(1,2,1)
plt.boxplot(data["数量"])
plt.subplot(1,2,2)
plt.boxplot(data[" 销售金额 "])
plt.show()

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》
④分布情况
如果数据需要服从正态分布。在3∂原则下,异常值如超过3倍标准差,那么可以将其视为异常值。正负3∂的概率是99.7%,那么距离平均值3∂之外的值出现的概率为P(|x-u| 3∂) = 0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述,比如这里我就指定超过4倍标准差就为异常值

2、异常值处理

删除——先将异常值替换为na,然后用dropna()删除
视为缺失值——先将异常值替换为na,然后用缺失值处理方法处理(填充,插值等)

比如用箱形图的办法,超过了上四分位1.5倍四分位距或下四分位1.5倍距离都算异常值,用中位数填充

a = data["数量"].quantile(0.75)
b = data["数量"].quantile(0.25)
c = data["数量"]
c[(c>=(a-b)*1.5+a)|(c<=b-(a-b)*1.5)]=np.nan
c.fillna(c.median(),inplace=True)
print(c.describe())

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》
再比如用标准差和均值,定义超过4倍就算异常值

a = data["数量"].mean()+data["数量"].std()*4
b = data["数量"].mean()-data["数量"].std()*4
c = data["数量"]
c[(c>=a)|(c<=b)]=np.nan
c.fillna(c.median(),inplace=True)
print(c.describe())

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》
两种方法得出的结果不一样,具体选择哪种要看业务的性质

像电商、游戏或直播行业,确实存在大户人数占比不到1% 但贡献占比达到80%的情况,所以这种时候就要放宽异常值的限定,选择后面这种方法,如果是趋于稳定的,比如传统的汽车行业,一个用户不可能一次性购买很多很多辆,所以可以将条件设紧一点**

本人互联网数据分析师,目前已出ExcelSQLPandasMatplotlibSeaborn机器学习统计学个性推荐关联算法工作总结系列。

微信搜索 ” 数据小斑马” 公众号,回复“数据分析“就可以免费领取数据分析升级打怪 15本必备教材

《Pandas数据分析②——数据清洗(重复值/缺失值/异常值)》

    原文作者:数据小斑马
    原文地址: https://blog.csdn.net/cindy407/article/details/90762774
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞