数据清洗

Posted tunan-ki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据清洗相关的知识,希望对你有一定的参考价值。

处理缺失值

通过isnull和notnull方法,可以返回布尔值的对象。

这时通过求和可以获取每列的缺失值数量,再通过求和就可以获得整个DataFrame的缺失值数量

侦查缺失值

创建有缺失值的DataFeame

>>> from pandas import Series,DataFrame

>>> import pandas as pd

>>> import numpy as np

>>> df1 = DataFrame([[5,3,5],[1,6,np.nan],["lili",np.nan,"pop"],[np.nan,"a","b"]])
>>> df1

      0    1    2

0     5    3    5

1     1    6  NaN

2  lili  NaN  pop

3   NaN    a    b

查看缺失值

>>> df1.isnull()

       0      1      2

0  False  False  False

1  False  False   True

2  False   True  False

3   True  False  False
>>> df1.notnull()

       0      1      2

0   True   True   True

1   True   True  False

2   True  False   True

3  False   True   True

缺失值计算

>>> df1.isnull().sum()

0    1

1    1

2    1

dtype: int64

 

>>> df1.isnull().sum().sum()

3

 

通过info()方法查看缺失值

>>> df1.info()
<class pandas.core.frame.DataFrame>

RangeIndex: 4 entries, 0 to 3

Data columns (total 3 columns):

0    3 non-null object

1    3 non-null object

2    3 non-null object

dtypes: object(3)

memory usage: 224.0+ bytes

删除缺失值

通过dropna可以删除具有缺失值的行

>>> df1.dropna()

   0  1  2

0  5  3  5

 

传入how=”all”,则只会删除全为NaN的那些行

>>> df2

     0    1    2   3

0  0.0  1.0  2.0 NaN

1  4.0  5.0  6.0 NaN

2  NaN  NaN  NaN NaN

>>> df2.dropna(how="all")

     0    1    2   3

0  0.0  1.0  2.0 NaN

1       4.0  5.0  6.0 NaN

如果需要删除列,则指定轴方向即可

>>> df2.dropna(how="all",axis=1)

     0    1    2

0  0.0  1.0  2.0

1  4.0  5.0  6.0

2       NaN  NaN  NaN

填充缺失值

通过fillna方法可以将缺失值替换为常数值

填充缺失值

>>> df2.fillna(0)

     0    1    2    3

0  0.0  1.0  2.0  0.0

1  4.0  5.0  6.0  0.0

3  0.0  0.0  0.0  0.0

针对不同列填充不同值

在fillna中传入字典结构数据,可以针对不同列填充不同的值,fillna返回的新对象不会对原数据库进行修改,可通过inplace就地进行修改

下标为1的列替换为6,下标为3的列替换为

>>> df2.fillna({1:6,3:0})

     0    1    2    3

0  0.0  1.0  2.0  0.0

1  4.0  5.0  6.0  0.0

2  NaN  6.0  NaN  0.0

>>> 

在原对象上修改

>>> df2.fillna({1:6,3:0},inplace=True)

>>> df2

     0    1    2    3

0  0.0  1.0  2.0  0.0

1  4.0  5.0  6.0  0.0

2  NaN  6.0  NaN  0.0

>>> 

 

对重新索引reindex中填充缺失值的方法同样适用于fillna中

>>> df2.fillna(method="ffill")

     0    1    2    3

0  0.0  1.0  2.0  0.0

1  4.0  5.0  6.0  0.0

2  4.0  6.0  6.0  0.0

 

填充平均值(列方向)

>>> df2[0] = df2[0].fillna(df2[0].mean())

>>> df2

     0    1    2    3

0  0.0  1.0  2.0  0.0

1  4.0  5.0  6.0  0.0

2  2.0  6.0  NaN  0.0

>>> 

 

移除重复元素

在DataFrame中,通过duplicated方法判断各行是否有重复数据

查看是否有重复值

>>> data = {

...     "name":["张三","李四","张三","小明"],

...     "sex":["female","male","female","male"],

...     "year":[2001,2002,2001,2002],

...     "city":["北京","上海","北京","北京"],

... }

>>> 

>>> df1 = DataFrame(data)

>>> df1

  name     sex  year city

0   张三  female  2001   北京

1   李四    male  2002   上海

2   张三  female  2001   北京

3   小明    male  2002   北京

>>> df1.duplicated()

0    False

1    False

2     True

3    False

dtype: bool

 

通过drop_ duplicates()方法,可以删除多余的重复项

删除重复项

>>> df1.drop_duplicates()

  name     sex  year city

0   张三  female  2001   北京

1   李四    male  2002   上海

3   小明    male  2002   北京

>>> 

 

指定部分列作为判断重复项的依据

>>> df1.drop_duplicates(["sex","year"])

  name     sex  year city

0   张三  female  2001   北京

1   李四    male  2002   上海

>>> 

 

默认保存第一次出现的组合,可以通过keep=”list”可以保留最后一个出现的组合

>>> df1.drop_duplicates(["sex","year"])

  name     sex  year city

0   张三  female  2001   北京

1   李四    male  2002   上海

>>> 

 

替换值

在pandas中,通过replace可完成替换值的功能,也可以对不同值进行多值替换,参数传入方式可以是列表也可以是字典格式

替换值

>>> df1.replace("","不详")

  name     sex  year city

0   张三  female  2001   北京

1   李四    male  2002   上海

2   张三      不详  2001   不详

3   小明    male  2002   北京

>>> 

 

多值替换

同时替换空格和2001年为不详和2002年(列表)

>>> df1.replace(["",2001],["不详",2002])

  name     sex  year city

0   张三  female  2002   北京

1   李四    male  2002   上海

2   张三      不详  2002   不详

3   小明    male  2002   北京

>>> 

 

同时替换空格和2001年为不详和2002年(字典)

>>> df1.replace({"":"不详",2001:2002})

  name     sex  year city

0   张三  female  2002   北京

1   李四    male  2002   上海

2   张三      不详  2002   不详

3   小明    male  2002   北京

>>> 

 

利用函数或映射进行数据转换

在pandas中,通过map方法可以通过if函数实现分数等级的划分

数学成绩

>>> data = {

...     "name":["张三","李四","王五","小明"],

...     "math":[79,52,63,92]

... }

>>> df2 = DataFrame(data)

>>> df2

  name  math

0   张三    79

1   李四    52

2   王五    63

3   小明    92

>>> 

 

函数应用

>>> def f(x):

...     if x>=90:

...             return "优秀"

...     elif 70<=x<90:

...             return "良好"

...     elif 60<=x<70:

...             return "合格"

...     else:

...             return "不合格"

...

>>> df2["class"] = df2["math"].map(f)

>>> df2

  name  math class

0   张三    79    良好

1   李四    52   不合格

2   王五    63    合格

3   小明    92    优秀

>>> 

 

检测异常值

在数据分析中,通常会通过一些可视化的方法去找离群点,这些离群点可能就是异常值。

>>> df3 = DataFrame(np.arange(10),columns=["x"])

>>> df3["Y"]=2*df3["x"]+0.5

>>> df3.iloc[9,1]=185

>>> df3

   x      Y

0  0    0.5

1  1    2.5

2  2    4.5

3  3    6.5

4  4    8.5

5  5   10.5

6  6   12.5

7  7   14.5

8  8   16.5

9  9   184

 

 

>>> import matplotlib.pyplot as plt

>>> df3.plot(kind="scatter",x="x",y="Y")

<matplotlib.axes._subplots.AxesSubplot object at 0x000001BAE83A8188>

>>> plt.show()

技术图片

 

以上是关于数据清洗的主要内容,如果未能解决你的问题,请参考以下文章

转移,清洗,同步数据

Spark中利用Scala进行数据清洗(代码)

爬虫+数据清洗+可视化用Python分析“淄博烧烤“的评论数据

2017 级课堂测试试卷—数据清洗进度记录

数据挖掘中常用的数据清洗方法有哪些?

记一次python清洗疫情历史数据