常用的数据清洗方法

本文首发于微信公众号《Python希望社》,欢迎关注,完整详细的原文链接请点击这里

在数据处理的过程中,一般都需要进行数据的清洗工作,如数据集是否存在重复、是否存在确实、数据是否具有完整性和一致性、数据中是否存在异常值等。当发现数据中存在如上可能的问题时,都需要有针对性地处理。

本文大纲如下: 全文共5746字。

认真阅读本文你将掌握常用的数据清洗方法和策略

#mermaid-svg-YDTgW0mU5jLbLZCw .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .label text{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .node rect,#mermaid-svg-YDTgW0mU5jLbLZCw .node circle,#mermaid-svg-YDTgW0mU5jLbLZCw .node ellipse,#mermaid-svg-YDTgW0mU5jLbLZCw .node polygon,#mermaid-svg-YDTgW0mU5jLbLZCw .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-YDTgW0mU5jLbLZCw .node .label{text-align:center;fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .node.clickable{cursor:pointer}#mermaid-svg-YDTgW0mU5jLbLZCw .arrowheadPath{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-YDTgW0mU5jLbLZCw .flowchart-link{stroke:#333;fill:none}#mermaid-svg-YDTgW0mU5jLbLZCw .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-YDTgW0mU5jLbLZCw .edgeLabel rect{opacity:0.9}#mermaid-svg-YDTgW0mU5jLbLZCw .edgeLabel span{color:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-YDTgW0mU5jLbLZCw .cluster text{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-YDTgW0mU5jLbLZCw .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-YDTgW0mU5jLbLZCw text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-YDTgW0mU5jLbLZCw .actor-line{stroke:grey}#mermaid-svg-YDTgW0mU5jLbLZCw .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-YDTgW0mU5jLbLZCw #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .sequenceNumber{fill:#fff}#mermaid-svg-YDTgW0mU5jLbLZCw #sequencenumber{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw #crosshead path{fill:#333;stroke:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .messageText{fill:#333;stroke:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-YDTgW0mU5jLbLZCw .labelText,#mermaid-svg-YDTgW0mU5jLbLZCw .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-YDTgW0mU5jLbLZCw .loopText,#mermaid-svg-YDTgW0mU5jLbLZCw .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-YDTgW0mU5jLbLZCw .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-YDTgW0mU5jLbLZCw .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-YDTgW0mU5jLbLZCw .noteText,#mermaid-svg-YDTgW0mU5jLbLZCw .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-YDTgW0mU5jLbLZCw .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-YDTgW0mU5jLbLZCw .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-YDTgW0mU5jLbLZCw .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-YDTgW0mU5jLbLZCw .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw .section{stroke:none;opacity:0.2}#mermaid-svg-YDTgW0mU5jLbLZCw .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-YDTgW0mU5jLbLZCw .section2{fill:#fff400}#mermaid-svg-YDTgW0mU5jLbLZCw .section1,#mermaid-svg-YDTgW0mU5jLbLZCw .section3{fill:#fff;opacity:0.2}#mermaid-svg-YDTgW0mU5jLbLZCw .sectionTitle0{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .sectionTitle1{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .sectionTitle2{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .sectionTitle3{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-YDTgW0mU5jLbLZCw .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw .grid path{stroke-width:0}#mermaid-svg-YDTgW0mU5jLbLZCw .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-YDTgW0mU5jLbLZCw .task{stroke-width:2}#mermaid-svg-YDTgW0mU5jLbLZCw .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw .taskText:not([font-size]){font-size:11px}#mermaid-svg-YDTgW0mU5jLbLZCw .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-YDTgW0mU5jLbLZCw .task.clickable{cursor:pointer}#mermaid-svg-YDTgW0mU5jLbLZCw .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-YDTgW0mU5jLbLZCw .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-YDTgW0mU5jLbLZCw .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-YDTgW0mU5jLbLZCw .taskText0,#mermaid-svg-YDTgW0mU5jLbLZCw .taskText1,#mermaid-svg-YDTgW0mU5jLbLZCw .taskText2,#mermaid-svg-YDTgW0mU5jLbLZCw .taskText3{fill:#fff}#mermaid-svg-YDTgW0mU5jLbLZCw .task0,#mermaid-svg-YDTgW0mU5jLbLZCw .task1,#mermaid-svg-YDTgW0mU5jLbLZCw .task2,#mermaid-svg-YDTgW0mU5jLbLZCw .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-YDTgW0mU5jLbLZCw .taskTextOutside0,#mermaid-svg-YDTgW0mU5jLbLZCw .taskTextOutside2{fill:#000}#mermaid-svg-YDTgW0mU5jLbLZCw .taskTextOutside1,#mermaid-svg-YDTgW0mU5jLbLZCw .taskTextOutside3{fill:#000}#mermaid-svg-YDTgW0mU5jLbLZCw .active0,#mermaid-svg-YDTgW0mU5jLbLZCw .active1,#mermaid-svg-YDTgW0mU5jLbLZCw .active2,#mermaid-svg-YDTgW0mU5jLbLZCw .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-YDTgW0mU5jLbLZCw .activeText0,#mermaid-svg-YDTgW0mU5jLbLZCw .activeText1,#mermaid-svg-YDTgW0mU5jLbLZCw .activeText2,#mermaid-svg-YDTgW0mU5jLbLZCw .activeText3{fill:#000 !important}#mermaid-svg-YDTgW0mU5jLbLZCw .done0,#mermaid-svg-YDTgW0mU5jLbLZCw .done1,#mermaid-svg-YDTgW0mU5jLbLZCw .done2,#mermaid-svg-YDTgW0mU5jLbLZCw .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-YDTgW0mU5jLbLZCw .doneText0,#mermaid-svg-YDTgW0mU5jLbLZCw .doneText1,#mermaid-svg-YDTgW0mU5jLbLZCw .doneText2,#mermaid-svg-YDTgW0mU5jLbLZCw .doneText3{fill:#000 !important}#mermaid-svg-YDTgW0mU5jLbLZCw .crit0,#mermaid-svg-YDTgW0mU5jLbLZCw .crit1,#mermaid-svg-YDTgW0mU5jLbLZCw .crit2,#mermaid-svg-YDTgW0mU5jLbLZCw .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-YDTgW0mU5jLbLZCw .activeCrit0,#mermaid-svg-YDTgW0mU5jLbLZCw .activeCrit1,#mermaid-svg-YDTgW0mU5jLbLZCw .activeCrit2,#mermaid-svg-YDTgW0mU5jLbLZCw .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-YDTgW0mU5jLbLZCw .doneCrit0,#mermaid-svg-YDTgW0mU5jLbLZCw .doneCrit1,#mermaid-svg-YDTgW0mU5jLbLZCw .doneCrit2,#mermaid-svg-YDTgW0mU5jLbLZCw .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-YDTgW0mU5jLbLZCw .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-YDTgW0mU5jLbLZCw .milestoneText{font-style:italic}#mermaid-svg-YDTgW0mU5jLbLZCw .doneCritText0,#mermaid-svg-YDTgW0mU5jLbLZCw .doneCritText1,#mermaid-svg-YDTgW0mU5jLbLZCw .doneCritText2,#mermaid-svg-YDTgW0mU5jLbLZCw .doneCritText3{fill:#000 !important}#mermaid-svg-YDTgW0mU5jLbLZCw .activeCritText0,#mermaid-svg-YDTgW0mU5jLbLZCw .activeCritText1,#mermaid-svg-YDTgW0mU5jLbLZCw .activeCritText2,#mermaid-svg-YDTgW0mU5jLbLZCw .activeCritText3{fill:#000 !important}#mermaid-svg-YDTgW0mU5jLbLZCw .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-YDTgW0mU5jLbLZCw g.classGroup text .title{font-weight:bolder}#mermaid-svg-YDTgW0mU5jLbLZCw g.clickable{cursor:pointer}#mermaid-svg-YDTgW0mU5jLbLZCw g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-YDTgW0mU5jLbLZCw g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-YDTgW0mU5jLbLZCw .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-YDTgW0mU5jLbLZCw .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-YDTgW0mU5jLbLZCw .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-YDTgW0mU5jLbLZCw .dashed-line{stroke-dasharray:3}#mermaid-svg-YDTgW0mU5jLbLZCw #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-YDTgW0mU5jLbLZCw #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-YDTgW0mU5jLbLZCw #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-YDTgW0mU5jLbLZCw #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-YDTgW0mU5jLbLZCw #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-YDTgW0mU5jLbLZCw #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-YDTgW0mU5jLbLZCw #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-YDTgW0mU5jLbLZCw #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-YDTgW0mU5jLbLZCw .commit-id,#mermaid-svg-YDTgW0mU5jLbLZCw .commit-msg,#mermaid-svg-YDTgW0mU5jLbLZCw .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-YDTgW0mU5jLbLZCw g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-YDTgW0mU5jLbLZCw g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-YDTgW0mU5jLbLZCw g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-YDTgW0mU5jLbLZCw .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-YDTgW0mU5jLbLZCw .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-YDTgW0mU5jLbLZCw .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-YDTgW0mU5jLbLZCw .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-YDTgW0mU5jLbLZCw .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-YDTgW0mU5jLbLZCw .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-YDTgW0mU5jLbLZCw .edgeLabel text{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-YDTgW0mU5jLbLZCw .node circle.state-start{fill:black;stroke:black}#mermaid-svg-YDTgW0mU5jLbLZCw .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-YDTgW0mU5jLbLZCw #statediagram-barbEnd{fill:#9370db}#mermaid-svg-YDTgW0mU5jLbLZCw .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-YDTgW0mU5jLbLZCw .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-YDTgW0mU5jLbLZCw .statediagram-state .divider{stroke:#9370db}#mermaid-svg-YDTgW0mU5jLbLZCw .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-YDTgW0mU5jLbLZCw .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-YDTgW0mU5jLbLZCw .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-YDTgW0mU5jLbLZCw .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-YDTgW0mU5jLbLZCw .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-YDTgW0mU5jLbLZCw .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-YDTgW0mU5jLbLZCw .note-edge{stroke-dasharray:5}#mermaid-svg-YDTgW0mU5jLbLZCw .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-YDTgW0mU5jLbLZCw .error-icon{fill:#522}#mermaid-svg-YDTgW0mU5jLbLZCw .error-text{fill:#522;stroke:#522}#mermaid-svg-YDTgW0mU5jLbLZCw .edge-thickness-normal{stroke-width:2px}#mermaid-svg-YDTgW0mU5jLbLZCw .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-YDTgW0mU5jLbLZCw .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-YDTgW0mU5jLbLZCw .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-YDTgW0mU5jLbLZCw .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-YDTgW0mU5jLbLZCw .marker{fill:#333}#mermaid-svg-YDTgW0mU5jLbLZCw .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-YDTgW0mU5jLbLZCw {color: rgba(0, 0, 0, 0.75);font: ;}

常用的数据清洗方法
重复观测处理
检测
处理
缺失值处理
数据过滤/删除法dropna
数据填充 / 替换法fillna
插值法
异常值处理
异常值检测
异常值处理及其前后对比

一、重复观测处理

重复观测是指观测行存在重复的现象,重复观测的存在会影响数据分析和挖掘结果的准确性,所以在进行数据分析和建模之前都需要进行观测的重复性检验,如果存在重复观测,还需要进行重复项的删除。

1.1处理方法

(1)检测重复观测

pandas中使用duplicated方法,该方法返回的是数据行每一行的检验结果,即每一行返回一个bool值;

(2)处理重复观测

使用drop_duplicated方法移除重复值。

1.2 案例展示(电商类APP相关数据)

(1)待清洗的原始数据

原始数据

可以看出,**浅绿色 ** 突出显示数据行为重复观测示例。为此进行如下处理:

(2)重复观测处理示例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BSli6Jji-1615030308261)(F:\Typroa\微信公众号\1-向希望\数据清洗\2.gif)]

(3)源码

import pandas as pd
# load data
data = pd.read_excel('1.xlsx')
data
#----------------------------------------------------
# 判断是否存在重复观测
print('是否存在重复观测:',any(data.duplicated()))
#----------------------------------------------------
# 处理重复观测
data.drop_duplicates(inplace=True) # inplace=True时直接删除data中重复的数据
data
#----------------------------------------------------
## 将处理后的数据 重新保存
f = pd.ExcelWriter('data_processed.xlsx')   # 创建文件对象
data.to_excel(f)                            # 将处理后的data写入新建的excel中
f.save()                                    # 保存文件

二、缺失值处理

数据缺失在大部分数据应用中都很常见,Pandas使用浮点值NaN表示浮点或非浮点数组中的缺失数据,Python内置的None值也会被当作缺失值处理。

2.1 检测数据缺失

Pandas使用方法isnull检测是否为缺失值,检测对象的每个元素返回一个bool值。

结果演示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYeE7G0Y-1615030308266)(F:\DataCodes\《Codes》\Codes_from_JupyterNotebook\xxw_data_processing\22.gif)]

从上面的结果可以看出:data 数据中的第2个、第四个都被视为缺失值。(源码如下)

# 导入包库
import numpy as np
import pandas as pd
# 生成原始测试数据
data = pd.Series([10.0, None, 20,np.NaN, 30])
data
#----------------------------------------------------
print(data.isnull())
#----------------------------------------------------
print("是否存在缺失值:",any(data.isnull()))

2.2 处理数据缺失

对于缺失值一般可以采用三种方法,分别是过滤法、填充法和插值法。在这里我们分别给出每种方法的内容和案例展示(附源码)

(1)数据过滤 / 删除法 (dropna)

是指当缺失的观测比例非常低时(如5%以内),直接删除存在缺失的观测;或者当某些变量的缺失比例非常高时(如85%以上),直接删除这些缺失的变量。

数据过滤dropna方法的语法格式如下

dropna(axis = 0, how = 'any', thresh = None)
## -------- 参数注释 -----------
# (1)axis = 0 表示删除行(记录);axis = 1 表示删除列(变量)
# (2)how 参数可选值为 any 或 all, all 表示删除全有NaN的行
# (3)thresh 为整数类型,表示删除的条件,如thresh = 3,表示一行中至少有3个非NaN值时,才将其保留。

要查看关于 dropna方法的帮助,可以使用下面命令:(其他命令同理)

import pandas
help(pd.DataFrame.dropna)
案例展示:
原始数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8XhggXIW-1615030308270)(F:\DataCodes\《Codes》\Codes_from_JupyterNotebook\xxw_data_processing\222.gif)]

源码
import pandas as pd
a = pd.read_excel('3.xlsx',usecols = range(1,4))   # 提取 第2列到第4列的数据
a
#-------------------------------------
b1 = a.dropna()    # 删除所有的缺失值
print(b1)
#-------------------------------------
b2 = a.dropna(axis = 1, thresh = 9)  # 删除有效数据个数小于 9 的列
print(b2)
#-------------------------------------
b3 = a.drop('用户B', axis = 1)   # 删除用户B的数据
print(b3)

(2)数据填充 / 替换法 (fillna

是指用某种常数直接替换那些缺失值,例如,对于连续变量而言,可以使用均值或中位数替换;对于离散变量,可以使用众数替换。

当数据中出现缺失值时,还可以用其他的数值进行填充,常用的方法是 fillna, 其基本语法格式为:

fillna(value = None, method = None, axis = None, inplace = False)
# 其中value值除基本类型外,还可以使用字典,这样可以实现对不同的列填充不同的值。method表示采用的填补数据的方法,默认是None。

下面通过示例说明fillna 的用法。

案例展示:
原始数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmpxEsaQ-1615030308274)(F:\DataCodes\《Codes》\Codes_from_JupyterNotebook\xxw_data_processing\2222.gif)]

源码
import pandas as pd
a = pd.read_excel('4.xlsx')
a
#----------------------------
b1 = a.fillna(0)                           # 用 0 填补所有的缺失值
b2 = a.fillna(method = 'ffill')             # 用前一行的值填补缺失值
b3 = a.fillna(method = 'bfill')             # 用后一行的值填补,最后一行缺失值不处理
b4 = a.fillna(value = {'gender':a.gender.mode()[0],'age':a.age.mean(),'income':a.income.median()})
## 性别使用众数替换 年龄使用均值替换 收入使用中位数替换
#----------------------------
print(b1,'\n----------------------------\n',b2,'\n----------------------------\n',b3,'\n----------------------------\n',b4)

(3)插值法

插值法是指根据其他非缺失的变量或观测来预测缺失值,常见的插值法有线性插值法、K近邻插值法、Lagrange插值法等。

当出现缺失值时,也可以使用插值法对缺失值进行插补,插值的数学原理在 其中的插值方法可以使用:‘linear’, ‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’,‘cubic’,‘spline’,‘barycentric’,‘polynomial’.

案例演示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t1uEp6nC-1615030308277)(F:\DataCodes\《Codes》\Codes_from_JupyterNotebook\xxw_data_processing\22222.gif)]

源码
import pandas as pd
a = pd.read_excel('4.xlsx')
a
# ----------------------------------
import numpy as np
b = a.fillna(value = {'gender':a.gender.mode()[0],                              # 性别使用众数替换'age':a.age.interpolate(method = 'polynomial',order = 2), # 年龄使用 二次多项式插值 替换'income':a.income.interpolate()})                         # 收入使用线性插值替换

三、异常值处理

异常值(Outlier)是指哪些远离正常值的预测,即“不合群”观测。异常值的出现会对模型的创建和预测产生严重的后果。当然异常值的出现也不一定都是坏事,有些情况下,通过寻找异常值就能够给业务带来良好的发展,如【销毁“钓鱼网站”,关闭“薅羊毛”用户的权限等】

对于异常值的检测,一般采用两种方法,一种是标准差法,另一种是箱线图判别法。标准差法的判别公式是:outlier>x^+nσ\text{outlier}>\hat{x}+n\sigmaoutlier>x^+nσ 或者outlier<x^−nσ\text{outlier}<\hat{x}-n\sigmaoutlier<x^−nσ , 其中outlier<x^−nσ\text{outlier}< \hat x -n\sigmaoutlier<x^−nσ , 其中 x^\hat{x}x^ 是均值,σ\sigmaσ是样本标准差。当n=2n=2n=2 时, 满足条件的观测就是异常值;当n=3n=3n=3 时,满足条件的观测即是极端异常值。

箱线图的判别公式是:outlier>Q3+nIQR\text{outlier}>Q_3+n\text{IQR}outlier>Q3​+nIQR 或 outlier<Q1−nIQR\text{outlier}<Q_1-n\text{IQR}outlier<Q1​−nIQR , 其中Q1Q_1Q1​ 为下四分位数(25%),Q3Q_3Q3​ 为上四分位数(75%),IQR\text{IQR}IQR 为上四分位数与下四分位数的差。当$ n=1.5 时,满足条件的观测为异常值,当时,满足条件的观测为异常值,当时,满足条件的观测为异常值,当n=3$ 时,满足条件的观测为极端异常值。

这两种方法的选择标准如下,如果数据近似服从正态分布,因为数据的分布相对比较对称,优先选择标准差法。否则优先选择箱线图法,因为分位数并不会收到极端值的影响。当数据存在异常时,若异常观测的比例不要打,一般可以使用删除法将异常值删除;也可以使用替换法,可以考虑使用低于判别上限的最大值替换上端异常值、高于判别下限的最小值替换下端异常值,或使用均值或中位数替换等。

3.1 案例展示:

(1)异常值检测

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6diSHbF-1615030308278)(F:\DataCodes\《Codes》\Codes_from_JupyterNotebook\xxw_data_processing\222222.gif)]

原始数据和异常值检验结果

原始数据
直方图与核密度图

(2)异常值的处理及其前后对比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFOaax3T-1615030308279)(F:\DataCodes\《Codes》\Codes_from_JupyterNotebook\xxw_data_processing\2222222.gif)]

count mean std min 25% 50% 75% max
替换前 289 48.6135 39.4741 0 15.6 39 68.9 190.2
替换后 289 48.0660 37.9189 0 15.6 39 68.9 141.7

源码如下:

# =============================================
# 异常值检测
# =============================================
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
a = pd.read_csv('ISSN_Y_tot.csv')
a
#---------------------------------------------
plt.plot(a.counts)
plt.show()
#---------------------------------------------
mu = a.counts.mean()  # 计算黑子 个数年平均值
s = a.counts.std()    # 计算黑子个数标准差
print('标准差法异常值上限检测:',any(a.counts>mu+2*s))  # 输出: True
print('标准差法异常值下限检测:',any(a.counts<mu-2*s))  # 输出: False
#---------------------------------------------
Q1 = a.counts.quantile(0.25) # 计算下四分位数
Q3 = a.counts.quantile(0.75) # 计算上四分位数
IQR = Q3 - Q1
print("箱线图法异常值上限检测:",any(a.counts> Q3 + 1.5*IQR))  # 输出:  True
print("箱线图法异常值下限检测:",any(a.counts< Q1 - 1.5*IQR))  # 输出:  False
#---------------------------------------------
plt.style.use('ggplot')     # 设置绘图风格
a.counts.plot(kind = 'hist', bins = 30 , density = True)    # 绘制直方图
a.counts.plot(kind = 'kde')                                 # 绘制核密度曲线
plt.show()
# =============================================
#  异常值处理
# =============================================
print('异常值替换前的数据统计特征',a.counts.describe())
#---------------------------------------------
UB = Q3 + 1.5 * IQR;
st = a.counts[a.counts < UB].max()
print('判别异常值的上限临界值为:',UB)
print('用以替换异常值的数据为:',st)
#---------------------------------------------
a.loc[a.counts>UB,'counts'] = st      # 替换超过判别上限异常值
print('异常值替换后的数据特征\n',a.counts.describe())
参考文献

司首奎,孙玺菁.《Python数学实验与建模》. 北京:科学出版社,2020

推文中所涉及到的所有 数据集和全部源代码 均可通过在后台回复关键字”数据清洗“获得。

Python数据清洗 | 常用的数据清洗方法相关推荐

  1. python DataFrame常用描述性统计分析方法

    python DataFrame常用描述性统计分析方法 文章目录 python DataFrame常用描述性统计分析方法 sum() 求和 mean() 求平均值 max() 最大值 & mi ...

  2. 第九章、python中常用函数及方法------打开函数open,写入write、writelines,读取read、readlines、 readline

    目录 9.7 python的打开函数open (1)参数file (2)参数mode (3)参数buffering (4)参数encoding (5)参数errors (6)参数newline (7) ...

  3. 使用python进行数据清洗常用的库_python3常用的数据清洗方法(小结)

    首先载入各种包: import pandas as pd import numpy as np from collections import Counter from sklearn import ...

  4. Python常用的数据清洗方法

    Python常用的数据清洗方法 在数据处理的过程中,一般都需要进行数据的清洗工作,如数据集是否存在重复.是否存在缺失.数据是否具有完整性和一致性.数据中是否存在异常值等.当发现数据中存在如上可能的问题 ...

  5. 光滑噪声数据常用的方法_数据挖掘中常用的数据清洗方法

    是新朋友吗?记得先点蓝字关注我哦- 数据挖掘中 常用的数据清洗方法 在数据挖掘过程中,数据清洗主要根据探索性分析后得到的一些结论入手,然后主要对四类异常数据进行处理,分别是缺失值(missing va ...

  6. 常用的数据清洗方法学习笔记(全面、完整)

    常用的数据清洗方法 在数据处理过程中,一般都需要进行数据的处理工作,如数据集是否存在重复.是否存在缺失.数据是否具有一定的完整性和一致性.数据中是否存在异常值等,当发现数据中可能存在上述问题时,都需要 ...

  7. 基于Python的数据清洗常用工具

    基于Python的数据清洗常用工具 Python数据清洗实战入门之数据清洗的常用工具 一.数组运算库Numpy Numpy常用数据结构 创建一维数组 通过嵌套列表创建二维数组 使用Numpy的迭代器生 ...

  8. 数据清洗常用工具之Numpy

    数据清洗常用工具之Numpy 目前在 Python 中,numpy 和 pandas 是最主流的工具 Numpy 中的向量化运算使得数据处理变得高效 Pandas 提供了大量数据清洗的高效方法 在Py ...

  9. python csv 排序_python数据清洗

    python数据清洗 数据排序 import pandas as pa df=pd.DataFrame.sort_values(by,ascending=True,inplace=False) 参数及 ...

最新文章

  1. Winserver2012R2 部署密钥恢复代理
  2. oracle 生成 json文件,oracle - PLSQL导入JSON并导出为JSON文件 - 堆栈内存溢出
  3. java.lang.IllegalStateException: Error starting child错误的产生与解决
  4. mongodb数组字段prefix匹配返回
  5. 输入一个十进制数,转化为二进制
  6. Android中打包含有Activity以及资源文件的jar包在工程中调用
  7. 一篇文章带你读懂 MySQL 和 InnoDB
  8. 手机忽然就安装不了东西,就是下载好apk打开后按不了安装。怎么处理?
  9. 2014年电大计算机应用基础考,2017年电大计算机应用基础网考精彩试题与问题详解...
  10. Qt Creator 配置Msvc 2012的调试器
  11. 超实用Mac苹果电脑终端命令
  12. 光学计算机的工作原理,使用光学计算机的人工智能超分辨率
  13. 《Internet-常见域名后缀大全》
  14. 面试官看到一定会打我---软件测试工程师面试套路和暗语灵魂解密
  15. 分享一个基于Vue的家谱图/组织结构图实现方案
  16. 阿里,淘宝,天猫,京东2012年的大概销售额
  17. 六轴机器人轨迹规划之五段位置s曲线插补
  18. 扫描仪显示计算机无法,扫描仪无法显示怎么办 扫描仪无法显示解决方法【详解】...
  19. Rosserial Arduino Library中从一行代码开始探究系统原理
  20. 项目管理中的关键路径

热门文章

  1. mysql常规索引有哪些_mysql常见索引类型有哪些
  2. 使用SVM预测大盘涨跌的简单策略
  3. mysql 乐观锁 时间戳_MySQL乐观锁
  4. W公司对接奥迪Audi EDI项目案例
  5. 前端实现WebSocket即时通讯
  6. Emscripten 单词_北师大版|高中英语必修1选修8单词听力汇总|Unit1—Unit24
  7. Google访问网站危险处理
  8. 论做游戏外挂,Python 输过谁?
  9. VC、PE和天使投资是什么意思?有什么区别?
  10. python 字符串赋值操作_python字符串操作