• 《对比Excel,轻松学习Python数据分析》读书笔记------数据预处理



    5 数据预处理

    在开始正式的数据分析前,我们需要对不合理的数据进行预先的处理。

    常见的不合理数据有缺失数据、重复数据、异常数据等

    5.1 缺失值处理

    对于各种原因造成的缺失空值,一般有两种处理方式:

    • 把含有缺失值的整行数据删除
    • 将缺失值用其他值替换

    5.1.1 查看缺失值

    Excel

    • 可以选中一定完整的那一列查看数据个数作为基数 n n n,再依次其他列选中其他列得到数据个数 m m m,作差 n − m n-m nm即可得到各列的缺失值个数。
    • 先选中一块大区域,Ctrl+g调出"定位"窗口,打开"定位条件",选择"空值",即可选中该区域内的所有空值。

    在这里插入图片描述

    在这里插入图片描述

    Python

    在Pandas中,"NaN"代表数字型空值

    info()
    df_obj.info()
    
    • 1

    之前我们利用这个方法来查看字段的数据类型,但它也能显示出空值的信息。

    如:

    grades_df.info()
    """
    
    Index: 18 entries, 包宏伟 to 张桂花
    Data columns (total 11 columns):
     #   Column  Non-Null Count  Dtype  
    ---  ------  --------------  -----  
     0   学号      18 non-null     int64  
     1   班级      18 non-null     object 
     2   语文      18 non-null     float64
     3   数学      16 non-null     float64
     4   英语      18 non-null     int64  
     5   生物      17 non-null     float64
     6   地理      18 non-null     int64  
     7   历史      18 non-null     int64  
     8   政治      18 non-null     int64  
     9   总分      18 non-null     float64
     10  平均分     18 non-null     float64
    dtypes: float64(5), int64(5), object(1)
    memory usage: 1.7+ KB
    """
    
    #18个行索引,第3列16个非空值(non-null),第5列有17个非空值,说明第3列有18-16=2个缺失值,第5列有18-17=1个缺失值
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    isnull()
    df_obj.isnull()
    
    • 1
    • 返回bool类型的表格,True代表为缺失空值
    • 返回一个DataFrame对象

    如:

    print(grades_df.isnull())
    """
            学号     班级     语文     数学     英语     生物     地理     历史     政治     总分  \
    姓名                                                                          
    包宏伟  False  False  False  False  False  False  False  False  False  False   
    陈万地  False  False  False  False  False  False  False  False  False  False   
    杜学江  False  False  False  False  False  False  False  False  False  False   
    符合   False  False  False  False  False   True  False  False  False  False   
    吉祥   False  False  False   True  False  False  False  False  False  False   
    李北大  False  False  False  False  False  False  False  False  False  False   
    李娜娜  False  False  False  False  False  False  False  False  False  False   
    刘康锋  False  False  False  False  False  False  False  False  False  False   
    刘鹏举  False  False  False   True  False  False  False  False  False  False   
    倪冬声  False  False  False  False  False  False  False  False  False  False   
    齐飞扬  False  False  False  False  False  False  False  False  False  False   
    苏解放  False  False  False  False  False  False  False  False  False  False   
    孙玉敏  False  False  False  False  False  False  False  False  False  False   
    王清华  False  False  False  False  False  False  False  False  False  False   
    谢如康  False  False  False  False  False  False  False  False  False  False   
    闫朝霞  False  False  False  False  False  False  False  False  False  False   
    曾令煊  False  False  False  False  False  False  False  False  False  False   
    张桂花  False  False  False  False  False  False  False  False  False  False   
    
           平均分  
    姓名          
    包宏伟  False  
    陈万地  False  
    杜学江  False  
    符合   False  
    吉祥   False  
    李北大  False  
    李娜娜  False  
    刘康锋  False  
    刘鹏举  False  
    倪冬声  False  
    齐飞扬  False  
    苏解放  False  
    孙玉敏  False  
    王清华  False  
    谢如康  False  
    闫朝霞  False  
    曾令煊  False  
    张桂花  False  
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    5.1.2 删除缺失值所在行

    Excel

    选中缺失值后,右键选择"删除"–>“整行”

    在这里插入图片描述

    Python

    df_obj.dropna(axis: 'Axis' = 0,
        how: 'str' = 'any',
        inplace: 'bool' = False,
    )
    
    • 1
    • 2
    • 3
    • 4
    • axis设置删除的是行还是列。为0代表行,为1代表列。默认为列。
    • how设置删除条件。为"any"代表只要本行/列出现空值就删除。为"all"代表只有本行全为空值才删除。默认为"any"
    • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False

    如:

    df = pd.DataFrame([["张三", 18, 120],[None, None, 130],
                       [None, None, None], ["李四", 17, 100] ],
                      index=[1, 2, 3, 4],
                      columns=['姓名', '年龄', '得分'])
    
    print(df)
    """
         姓名    年龄     得分
    1    张三  18.0  120.0
    2  None   NaN  130.0
    3  None   NaN    NaN
    4    李四  17.0  100.0
    """
    
    new_df1=df.dropna(how="all")
    print(new_df1)
    """
         姓名    年龄     得分
    1    张三  18.0  120.0
    2  None   NaN  130.0
    4    李四  17.0  100.0
    """
    
    new_df2=df.dropna(how="any")
    print(new_df2)
    """
       姓名    年龄     得分
    1  张三  18.0  120.0
    4  李四  17.0  100.0
    """
    
    print(df)     # 以上操作默认在返回的新表中操作,不会影响原表
    """
         姓名    年龄     得分
    1    张三  18.0  120.0
    2  None   NaN  130.0
    3  None   NaN    NaN
    4    李四  17.0  100.0
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    5.1.3 替换缺失值

    当缺失值占整行数据少于 30 % 30\% 30%时,我们可以考虑把缺失值替换成其他值。

    Excel

    通过"定位条件"选中所有空值后,在第一个空值中输入要替换成的目标值(常用0、众数、平均数、相邻数据等),Ctrl+Enter ,即可替换所有空值。

    Python

    df.fillna(value: 'object | ArrayLike | None' = None,
        method: 'FillnaOptions | None' = None,
        axis: 'Axis | None' = None,
        inplace: 'bool' = False,
        )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • value设置替换值。可以传入单个替换值。也可以传入key为行/列索引,value为该行/列的替换值组成的字典。

    • method设置可选的替换方式。padffill为上一个非空值。backfillbfill为下一个非空值。

    • axis设置替换的单位是行还是列。为0代表行,为1代表列。默认为列。

    • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False

    如:

    df = pd.DataFrame([["张三", 18, 120],[None, None, 130],
                       [None, None, None], ["李四", 17, 100] ],
                      index=[1, 2, 3, 4],
                      columns=['姓名', '年龄', '得分'])
    
    new_df1=df.fillna(0)
    print(new_df1)
    """
       姓名    年龄     得分
    1  张三  18.0  120.0
    2   0   0.0  130.0
    3   0   0.0    0.0
    4  李四  17.0  100.0
    """
    
    new_df2=df.fillna({"姓名":"佚名","年龄":18,"得分":0})
    print(new_df2)
    """
       姓名    年龄     得分
    1  张三  18.0  120.0
    2  佚名  18.0  130.0
    3  佚名  18.0    0.0
    4  李四  17.0  100.0
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    5.2 重复值处理

    重复值一般直接删除。

    Excel

    选中表格区域,在菜单栏依次选择"数据">“数据工具">“删除重复值”,勾选想要检测重复值的列。只要这些选中的列数据全部相同,就会删除重复行,只留下一个。

    Python

    df.drop_duplicates(subset: 'Hashable | Sequence[Hashable] | None' = None,
        keep: "Literal['first'] | Literal['last'] | Literal[False]" = 'first',
        inplace: 'bool' = False,
        ignore_index: 'bool' = False)
    
    • 1
    • 2
    • 3
    • 4
    • subset设置想要检测重复值的列。可以传入一个列表。默认为所有列。
    • keep设置保留的数据的位置。'first'代表第一个,'last'代表最后一个,None代表一个都不留。
    • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False
    • ignore_index设置是否重新设置默认索引(从0开始的整数)。False代表不重新设置,True代表重新设置。

    如:

    df = pd.DataFrame([["张三", 18, 120], ["张三", 18, 120], ["张三", 17, 130],
                       ["李四", 17, 120], ["李四", 17, 100]],
                      index=[1, 2, 3, 4, 5],
                      columns=['姓名', '年龄', '得分'])
    
    new_df1=df.drop_duplicates()
    print(new_df1)
    """
       姓名  年龄   得分
    1  张三  18  120
    3  张三  17  130
    4  李四  17  120
    5  李四  17  100
    """
    
    new_df2=df.drop_duplicates(subset=['姓名','年龄'])
    print(new_df2)
    """
    1  张三  18  120
    3  张三  17  130
    4  李四  17  120
    """
    
    new_df3=df.drop_duplicates(ignore_index=True)
    print(new_df3)
    """
       姓名  年龄   得分
    0  张三  18  120
    1  张三  17  130
    2  李四  17  120
    3  李四  17  100
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    5.3 异常值处理

    异常值指非正常数据,要么过高,要么过低,总之不符合实际。

    5.3.1 检测异常值

    检测异常值的常用策略:

    • 划定正常范围,不在该范围内视为异常值
    • 绘制箱形图(16章详述)
    • 如果数据符合正态分布,可以将 ( μ − 3 σ , μ + 3 σ ) (\mu-3\sigma,\mu+3\sigma) (μ3σ,μ+3σ) 范围之外的数据视为异常值。( μ \mu μ为平均值, σ \sigma σ为标准差)

    5.3.2 异常值处理

    处理异常值的常用策略:

    • 直接删除
    • 当做缺失值,进行另外填充
    • 对异常值进行特别的研究,探寻异常值出现的原因

    Excel

    • 直接删除:通过"筛选"功能得到异常值,选中,右键"删除行"
    • 填充:通过"筛选"功能得到异常值,选中,替换为其他值

    Python

    • 直接删除:通过bool条件过滤掉异常值,得到新的DataFrame表对象
    • 填充:replace方法

    其他章节详述

    5.4 数据类型转换

    5.4.1 数据类型

    Excel

    选中某一列,在"数字"栏中可查看其数据类型:

    在这里插入图片描述

    Python

    Pandas的主要数据类型有以下几种:

    • 字符串类型:object(还可表示混合类型)
    • 整数类型:Int64,Int32,Int16, Int8
    • 无符号整数:UInt64,UInt32,UInt16, UInt8
    • 浮点数类型:float64,float32
    • 日期和时间类型:datetime64[ns]、datetime64[ns, tz]、timedelta[ns]
    • 布尔类型:bool

    可以使用前面介绍过的info()方法来查看整个表的数据类型及其他信息,还可以通过dtypes属性只获取整个表的数据类型,列的dtype属性获取特定列的数据类型。

    df.dtypes
    df[列索引].dtype
    
    • 1
    • 2

    如:

    df = pd.DataFrame(
        {
            "学科": ["数学分析", "高等代数", "解析几何"],
            "学期": [3, 2, 1],
            "学分": [18, 12, 4],
            "是否必修": [True, True, False]
        },
        index=range(1, 4))
    
    print(df["学科"].dtype)
    print(df["学期"].dtype)
    print(df["学分"].dtype)
    print(df["是否必修"].dtype)
    
    """
    object
    int64
    int64
    bool
    """
    
    print(df.dtypes)
    """
    学科      object
    学期       int64
    学分       int64
    是否必修      bool
    dtype: object
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    5.4.2 数据类型转换

    不同的数据类型能进行的操作不同。为了满足需求,需要将数据强制转换为正确的类型。

    Excel

    选中某列,同样在"数字"栏,点击类型完成转换。有时可以看到明显的格式变化。

    在这里插入图片描述

    Python

    df.astype(dtype, copy: 'bool_t' = True, errors: 'str' = 'raise')
    
    • 1
    • dtype可以传入字典,key为列索引,value为转化的目标类型
    • copy设置是否复制,即不在原表上操作,返回新表,默认为True
    • errors设置转化失败后的行为。'raise'为报错,'ignore'为忽视。默认'raise'

    如:

    new_df=df.astype({"学期":"object","学分":"float64"})
    
    print(df.dtypes)
    """
    学科      object
    学期       int64
    学分       int64
    是否必修      bool
    dtype: object
    """
    
    print(new_df.dtypes)
    """
    学科       object
    学期       object
    学分      float64
    是否必修       bool
    dtype: object
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    5.5 索引设置

    5.5.1 为无索引表添加索引

    Excel

    在表的第一行上方插入新的一行,在表的第一列左方插入新的一列。

    选中第一行/第一列,右击"插入>整行/整列"

    在新行新列中添加索引

    Python

    DataFrame对象默认以0开始的整数数列为索引。

    可以通过index属性修改行索引,columns属性修改列索引。

    df.index=[...]
    df.columns=[...]
    
    • 1
    • 2

    如:

    df = pd.DataFrame([["a", "A"], ["b", "B"], ["c", "C"]])
    print(df)
    """
       0  1
    0  a  A
    1  b  B
    2  c  C
    """
    
    df.index = range(1, 4)
    df.columns = ["小写", "大写"]
    print(df)
    """
      小写 大写
    1  a  A
    2  b  B
    3  c  C
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    5.5.2 将某列设置为行索引

    Excel

    将该列拖动到第一列即可

    Python

    df.set_index(keys,
                 drop: 'bool' = True,
                 inplace: 'bool' = False
                )
    
    • 1
    • 2
    • 3
    • 4
    • key可为单个列索引,或列索引列表(称为层次化索引)
    • drop设置是否删除表中的该列,仅将其设为索引。默认为True
    • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False

    如:

    df = pd.DataFrame({
        "商品名称": ["苹果", "梨", "手机", "电脑", "玩偶", "玩具汽车"],
        "商品种类": ["食品", "食品", "电子产品", "电子产品", "玩具", "玩具"],
        "商品编号": [1, 2, 1, 2, 1, 2],
        "商品单价": [2, 3, 4000, 5000, 100, 200]
    })
    
    print(df)
    """
       商品名称  商品种类  商品编号  商品单价
    0    苹果    食品     1     2
    1     梨    食品     2     3
    2    手机  电子产品     1  4000
    3    电脑  电子产品     2  5000
    4    玩偶    玩具     1   100
    5  玩具汽车    玩具     2   200
    """
    
    new_df1 = df.set_index("商品编号")
    print(new_df1)
    """
          商品种类  商品编号  商品单价
    商品名称                  
    苹果      食品     1     2
    梨       食品     2     3
    手机    电子产品     1  4000
    电脑    电子产品     2  5000
    玩偶      玩具     1   100
    玩具汽车    玩具     2   200
    """
    
    new_df2 = df.set_index(["商品种类", "商品编号"])
    print(new_df2)
    """
               商品名称  商品单价
    商品种类 商品编号            
    食品   1       苹果     2
         2        梨     3
    电子产品 1       手机  4000
         2       电脑  5000
    玩具   1       玩偶   100
         2     玩具汽车   200
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    层次化索引可实现多维表格

    5.5.3 重命名索引

    Excel

    直接修改索引名即可。

    Python

    df.rename(index: 'Renamer | None' = None,
              columns: 'Renamer | None' = None,
              inplace: 'bool' = False,
              errors: 'str' = 'ignore',)
    
    • 1
    • 2
    • 3
    • 4
    • index设置行索引命名的过程。可以传入字典,key为旧索引名,value为新索引名。
    • columns设置列索引命名的过程。可以传入字典,key为旧索引名,value为新索引名。
    • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False
    • errors设置转化失败后的行为。'raise'为报错,'ignore'为忽视。默认'raise'

    如:

    new_df3=df.rename(columns={"商品名称":"名称","商品种类":"种类","商品编号":"编号"},index={0:6})
    print(new_df3)
    """
         名称    种类  编号  商品单价
    6    苹果    食品   1     2
    1     梨    食品   2     3
    2    手机  电子产品   1  4000
    3    电脑  电子产品   2  5000
    4    玩偶    玩具   1   100
    5  玩具汽车    玩具   2   200
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    5.5.4 重置行索引

    将行索引恢复为列

    Excel

    如果是一列的行索引,直接拖动离开第一列即可。

    如果是层次化索引,复制、粘贴、删除以恢复

    Python

    df.reset_index(level: 'Hashable | Sequence[Hashable] | None' = None,
                   drop: 'bool' = False,
                   inplace: 'bool' = False
                  )
    
    • 1
    • 2
    • 3
    • 4
    • level设置要恢复的行索引对应的列。默认所有层全部恢复。可指定层数(0开始)或列名。
    • drop设置是否删除对应索引,不把它恢复成数据列。默认为False
    • inplace设置的是否在原表上进行操作。为False代表不是,会返回一个新表。为True代表是,返回None.默认为False

    如:

    new_df4=new_df2.reset_index(level=1)
    print(new_df4)
    """
          商品编号  商品名称  商品单价
    商品种类                  
    食品       1    苹果     2
    食品       2     梨     3
    电子产品     1    手机  4000
    电子产品     2    电脑  5000
    玩具       1    玩偶   100
    玩具       2  玩具汽车   200
    """
    
    new_df5=new_df2.reset_index(level="商品编号")
    print(new_df5)
    """
          商品种类  商品名称  商品单价
    商品编号                  
    1       食品    苹果     2
    2       食品     梨     3
    1     电子产品    手机  4000
    2     电子产品    电脑  5000
    1       玩具    玩偶   100
    2       玩具  玩具汽车   200
    """
    
    new_df6=new_df2.reset_index()
    print(new_df6)
    """
       商品种类  商品编号  商品名称  商品单价
    0    食品     1    苹果     2
    1    食品     2     梨     3
    2  电子产品     1    手机  4000
    3  电子产品     2    电脑  5000
    4    玩具     1    玩偶   100
    5    玩具     2  玩具汽车   200
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    reset_index()方法常用于数据分组、数据透视表中


  • 相关阅读:
    Vue图片路径问题(动态引入)
    卷积神经网络数学建模,常见卷积神经网络模型
    使用Visual Leak Detector排查内存泄漏问题
    《HTTP/2 in Action》阅读笔记(一)
    Django 创建好的模块怎么在后台显示
    19Linux基本使用和web程序部署
    SqlSugar 5.联表查询
    数据结构 栈Stack的理解与C语言实现
    SpringCloudAlibaba 微服务组件 Nacos 之配置中心源码深度解析
    #Microsoft Edge功能测评!# 关于Edge浏览器以及插件推荐
  • 原文地址:https://blog.csdn.net/ncu5509121083/article/details/126098554