【Pandas数据分析5】数据清洗

时间:2022-10-11 19:51:51

五、数据清洗

源数据:

【Pandas数据分析5】数据清洗

import pandas as pd

pd.set_option('display.unicode.east_asian_width', True)

df = pd.read_excel('../data/马士兵课程记录.xlsx')
print(df)
print('---------------------------------------------------------------')
   买家会员名  买家实际支付金额  课程总数量              课程标题  类别 订单付款时间
0      msb001          30960.00         2.0  Java互联网高级架构师  课程   2020-10-09
1      msb002              1.00         1.0    金三银四面试突击班   NaN   2020-10-09
2      msb003           9980.00         1.0    GoLang从入门到精通  课程   2020-01-19
3      msb004           9980.00         NaN  算法与数据结构进阶班  课程   2020-06-30
4      msb005              9.90         1.0       大前端VIP体验营   NaN   2020-03-23
5      msb006              0.02         1.0  零基础速成班HTML+CSS  课程   2020-03-24
6      msb007           2400.00         1.0              操作系统  课程   2020-03-25
7      msb008              1.00         NaN            自定义注解  课程   2020-03-26
8      msb009           2980.00         1.0        多线程与高并发  课程   2020-03-27
9      msb010           1980.00         1.0              科技英语  课程   2020-03-28
10     msb010           1980.00         1.0              科技英语  课程   2020-03-28

1、查看缺失值

使用DataFrame对象的info()方法

print(df.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 11 entries, 0 to 10
Data columns (total 6 columns):
 #   Column    Non-Null Count  Dtype         
---  ------    --------------  -----         
 0   买家会员名     11 non-null     object        
 1   买家实际支付金额  11 non-null     float64       
 2   课程总数量     9 non-null      float64       
 3   课程标题      11 non-null     object        
 4   类别        9 non-null      object        
 5   订单付款时间    11 non-null     datetime64[ns]
dtypes: datetime64[ns](1), float64(2), object(3)
memory usage: 656.0+ bytes
None

2、判断数据是否存在缺失值

使用DataFrame的isnull()方法和notnull()方法

print(df.isnull())
print('---------------------------------------------------------------')
print(df.notnull())
    买家会员名  买家实际支付金额  课程总数量  课程标题   类别  订单付款时间
0        False             False       False     False  False         False
1        False             False       False     False   True         False
2        False             False       False     False  False         False
3        False             False        True     False  False         False
4        False             False       False     False   True         False
5        False             False       False     False  False         False
6        False             False       False     False  False         False
7        False             False        True     False  False         False
8        False             False       False     False  False         False
9        False             False       False     False  False         False
10       False             False       False     False  False         False
---------------------------------------------------------------
    买家会员名  买家实际支付金额  课程总数量  课程标题   类别  订单付款时间
0         True              True        True      True   True          True
1         True              True        True      True  False          True
2         True              True        True      True   True          True
3         True              True       False      True   True          True
4         True              True        True      True  False          True
5         True              True        True      True   True          True
6         True              True        True      True   True          True
7         True              True       False      True   True          True
8         True              True        True      True   True          True
9         True              True        True      True   True          True
10        True              True        True      True   True          True

3、缺失值的处理方式

  • 不处理

  • 删除

    • 删除所有NaN
    df = df.dropna()
    print(df)
    
       买家会员名  买家实际支付金额  课程总数量              课程标题  类别 订单付款时间
    0      msb001          30960.00         2.0  Java互联网高级架构师  课程   2020-10-09
    2      msb003           9980.00         1.0    GoLang从入门到精通  课程   2020-01-19
    5      msb006              0.02         1.0  零基础速成班HTML+CSS  课程   2020-03-24
    6      msb007           2400.00         1.0              操作系统  课程   2020-03-25
    8      msb009           2980.00         1.0        多线程与高并发  课程   2020-03-27
    9      msb010           1980.00         1.0              科技英语  课程   2020-03-28
    10     msb010           1980.00         1.0              科技英语  课程   2020-03-28
    
    • 提取其中不为NaN 或 删除指定NaN
    df = df[df['课程总数量'].notnull()]
    print(df)
    
       买家会员名  买家实际支付金额  课程总数量              课程标题  类别 订单付款时间
    0      msb001          30960.00         2.0  Java互联网高级架构师  课程   2020-10-09
    1      msb002              1.00         1.0    金三银四面试突击班   NaN   2020-10-09
    2      msb003           9980.00         1.0    GoLang从入门到精通  课程   2020-01-19
    4      msb005              9.90         1.0       大前端VIP体验营   NaN   2020-03-23
    5      msb006              0.02         1.0  零基础速成班HTML+CSS  课程   2020-03-24
    6      msb007           2400.00         1.0              操作系统  课程   2020-03-25
    8      msb009           2980.00         1.0        多线程与高并发  课程   2020-03-27
    9      msb010           1980.00         1.0              科技英语  课程   2020-03-28
    10     msb010           1980.00         1.0              科技英语  课程   2020-03-28
    
  • 填充或替换

df['课程总数量'] = df['课程总数量'].fillna(0)
print(df)
   买家会员名  买家实际支付金额  课程总数量              课程标题  类别 订单付款时间
0      msb001          30960.00         2.0  Java互联网高级架构师  课程   2020-10-09
1      msb002              1.00         1.0    金三银四面试突击班   NaN   2020-10-09
2      msb003           9980.00         1.0    GoLang从入门到精通  课程   2020-01-19
3      msb004           9980.00         0.0  算法与数据结构进阶班  课程   2020-06-30
4      msb005              9.90         1.0       大前端VIP体验营   NaN   2020-03-23
5      msb006              0.02         1.0  零基础速成班HTML+CSS  课程   2020-03-24
6      msb007           2400.00         1.0              操作系统  课程   2020-03-25
7      msb008              1.00         0.0            自定义注解  课程   2020-03-26
8      msb009           2980.00         1.0        多线程与高并发  课程   2020-03-27
9      msb010           1980.00         1.0              科技英语  课程   2020-03-28
10     msb010           1980.00         1.0              科技英语  课程   2020-03-28
  • 插值(均值、中位数、众数等填补)

4、重复值处理

  • 判断是否具有重复值
print(df.duplicated())
0     False
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10     True
dtype: bool
  • 去除重复数据
df = df.drop_duplicates()
print(df)
  买家会员名  买家实际支付金额  课程总数量              课程标题  类别 订单付款时间
0     msb001          30960.00         2.0  Java互联网高级架构师  课程   2020-10-09
1     msb002              1.00         1.0    金三银四面试突击班   NaN   2020-10-09
2     msb003           9980.00         1.0    GoLang从入门到精通  课程   2020-01-19
3     msb004           9980.00         NaN  算法与数据结构进阶班  课程   2020-06-30
4     msb005              9.90         1.0       大前端VIP体验营   NaN   2020-03-23
5     msb006              0.02         1.0  零基础速成班HTML+CSS  课程   2020-03-24
6     msb007           2400.00         1.0              操作系统  课程   2020-03-25
7     msb008              1.00         NaN            自定义注解  课程   2020-03-26
8     msb009           2980.00         1.0        多线程与高并发  课程   2020-03-27
9     msb010           1980.00         1.0              科技英语  课程   2020-03-28
  • 去除指定列的重复数据,保留后一个
df = df.drop_duplicates(['买家实际支付金额'], keep='last')
print(df)
   买家会员名  买家实际支付金额  课程总数量              课程标题  类别 订单付款时间
0      msb001          30960.00         2.0  Java互联网高级架构师  课程   2020-10-09
3      msb004           9980.00         NaN  算法与数据结构进阶班  课程   2020-06-30
4      msb005              9.90         1.0       大前端VIP体验营   NaN   2020-03-23
5      msb006              0.02         1.0  零基础速成班HTML+CSS  课程   2020-03-24
6      msb007           2400.00         1.0              操作系统  课程   2020-03-25
7      msb008              1.00         NaN            自定义注解  课程   2020-03-26
8      msb009           2980.00         1.0        多线程与高并发  课程   2020-03-27
10     msb010           1980.00         1.0              科技英语  课程   2020-03-28
  • 直接删除,保留一个副本
new_df = df.drop_duplicates(['买家实际支付金额'], inplace=False)
print(new_df)  # 修改后
print('-----------------------------------------------------------------------------------')
print(df)  # 原数据
  买家会员名  买家实际支付金额  课程总数量              课程标题  类别 订单付款时间
0     msb001          30960.00         2.0  Java互联网高级架构师  课程   2020-10-09
1     msb002              1.00         1.0    金三银四面试突击班   NaN   2020-10-09
2     msb003           9980.00         1.0    GoLang从入门到精通  课程   2020-01-19
4     msb005              9.90         1.0       大前端VIP体验营   NaN   2020-03-23
5     msb006              0.02         1.0  零基础速成班HTML+CSS  课程   2020-03-24
6     msb007           2400.00         1.0              操作系统  课程   2020-03-25
8     msb009           2980.00         1.0        多线程与高并发  课程   2020-03-27
9     msb010           1980.00         1.0              科技英语  课程   2020-03-28
-----------------------------------------------------------------------------------
   买家会员名  买家实际支付金额  课程总数量              课程标题  类别 订单付款时间
0      msb001          30960.00         2.0  Java互联网高级架构师  课程   2020-10-09
1      msb002              1.00         1.0    金三银四面试突击班   NaN   2020-10-09
2      msb003           9980.00         1.0    GoLang从入门到精通  课程   2020-01-19
3      msb004           9980.00         NaN  算法与数据结构进阶班  课程   2020-06-30
4      msb005              9.90         1.0       大前端VIP体验营   NaN   2020-03-23
5      msb006              0.02         1.0  零基础速成班HTML+CSS  课程   2020-03-24
6      msb007           2400.00         1.0              操作系统  课程   2020-03-25
7      msb008              1.00         NaN            自定义注解  课程   2020-03-26
8      msb009           2980.00         1.0        多线程与高并发  课程   2020-03-27
9      msb010           1980.00         1.0              科技英语  课程   2020-03-28
10     msb010           1980.00         1.0              科技英语  课程   2020-03-28

5、异常值的检测与处理

【Pandas数据分析5】数据清洗

  • 什么是异常值
    • 超出或低于正常范围的值
  • 异常值的检测方式
    • 根据给定的数据范围进行判断,不在范围内的数据视为异常值
    • 均方差
    • 箱形图
  • 异常值的处理方式
    • 删除
    • 当缺失值处理
    • 当特殊情况进行分析