【Python数据处理篇——DataFrame数据清洗】重复值处理、缺失值处理、特定值替换、删除指定条件行

欢迎访问我搞事情的【知乎账号】:Coffee
以及我的【B站漫威剪辑账号】:VideosMan
若我的笔记对你有帮助,请用小小的手指,点一个大大的赞哦。

关于DataFrame的相关知识,我还进行了汇总,数据清洗是DataFrame其中重要的知识点,欢迎点赞收藏!!

【Python学习笔记—保姆版】第四章—关于Pandas、数据准备、数据处理、数据分析、数据可视化


【Python数据处理篇——DataFrame数据清洗】

  • 4.3.1 数据清洗
  • 1、重复值的处理:drop_duplicates()
  • 2、缺失值处理:
  • 1. dropna() 去除数据结构中值为空的数据行
  • 2. df.fillna() 用其他数值替代NaN,有些时候空数据直接删除会影响分析的结果,可以对数据进行填补。【例4-8】使用数值或者任意字符替代缺失值
  • 3. df.fillna(method='pad') 用前一个数据值替代NaN
  • 4. df.fillna(method='bfill') 用后一个数据值替代NaN
  • 5. df.fillna(df.mean()) 用平均数或者其他描述性统计量来代替NaN。
  • 6. df.fillna(df.mean()[math: physical]) 可以选择列进行缺失值的处理
  • 7. strip():清除字符型数据左右(首尾)指定的字符,默认为空格,中间的不清除。
  • 3、特定值替换:replace('缺考', 0)
  • 4、删除满足条件元素所在的行:drop()
  • 4.3.1 数据清洗

    1、重复值的处理:drop_duplicates()

    drop_duplicates()    
    把数据结构中行相同的数据去除(保留其中的一行)
    

    【例4-6】数据去重。
    这里df是原始数据,其中7、9行、8、10行是重复行

     from pandas import DataFrame
     from pandas import read_excel
    df = read_excel('e://rz2.xlsx')
    df
    

    Out[1]:
    YHM TCSJ YWXT IP
    0 S1402048 18922254812 1.225790e+17 221.205.98.55
    1 S1411023 13522255003 1.225790e+17 183.184.226.205
    2 S1402048 13422259938 NaN 221.205.98.55
    3 20031509 18822256753 NaN 222.31.51.200
    4 S1405010 18922253721 1.225790e+17 120.207.64.3
    5 20140007 NaN 1.225790e+17 222.31.51.200
    6 S1404095 13822254373 1.225790e+17 222.31.59.220
    7 S1402048 13322252452 1.225790e+17 221.205.98.55
    8 S1405011 18922257681 1.225790e+17 183.184.230.38
    9 S1402048 13322252452 1.225790e+17 221.205.98.55
    10 S1405011 18922257681 1.225790e+17 183.184.230.38

    newDF=df.drop_duplicates()
    newDF
    

    Out[2]:
    YHM TCSJ YWXT IP
    0 S1402048 18922254812 1.225790e+17 221.205.98.55
    1 S1411023 13522255003 1.225790e+17 183.184.226.205
    2 S1402048 13422259938 NaN 221.205.98.55
    3 20031509 18822256753 NaN 222.31.51.200
    4 S1405010 18922253721 1.225790e+17 120.207.64.3
    5 20140007 NaN 1.225790e+17 222.31.51.200
    6 S1404095 13822254373 1.225790e+17 222.31.59.220
    7 S1402048 13322252452 1.225790e+17 221.205.98.55
    8 S1405011 18922257681 1.225790e+17 183.184.230.38

    上面的df中第7和第9行数据相同,第8和第10行数据相同,去重后第7、9和8、10各保留一行数据。

    2、缺失值处理:

    dropna()、df.fillna() 、df.fillna(method=‘pad’)、df.fillna(method=‘bfill’)、df.fillna(df.mean())、df.fillna(df.mean()[math: physical]) 、strip()

    对于缺失数据的处理方式有数据补齐、删除对应行、不处理等方法。

    【例4-6】缺失处理。
    这里df是原始数据,其中2、3、5行有缺失值

    from pandas import DataFrame   
    from pandas import read_excel   
    df = read_excel('e://rz2.xlsx')    
    df  
    

    Out[1]:
    YHM TCSJ YWXT IP
    0 S1402048 18922254812 1.225790e+17 221.205.98.55
    1 S1411023 13522255003 1.225790e+17 183.184.226.205
    2 S1402048 13422259938 NaN 221.205.98.55
    3 20031509 18822256753 NaN 222.31.51.200

    4 S1405010 18922253721 1.225790e+17 120.207.64.3
    5 20140007 NaN 1.225790e+17 222.31.51.200
    6 S1404095 13822254373 1.225790e+17 222.31.59.220
    7 S1402048 13322252452 1.225790e+17 221.205.98.55
    8 S1405011 18922257681 1.225790e+17 183.184.230.38
    9 S1402048 13322252452 1.225790e+17 221.205.98.55
    10 S1405011 18922257681 1.225790e+17 183.184.230.38

    1. dropna() 去除数据结构中值为空的数据行

    【例4-7】删除数据为空所对应的

    from pandas import DataFrame
    from pandas import read_excel
    df = read_excel('e://rz2.xlsx')
    newDF=df.dropna()
    newDF
    

    Out[3]:
    YHM TCSJ YWXT IP
    0 S1402048 18922254812 1.225790e+17 221.205.98.55
    1 S1411023 13522255003 1.225790e+17 183.184.226.205
    4 S1405010 18922253721 1.225790e+17 120.207.64.3
    6 S1404095 13822254373 1.225790e+17 222.31.59.220
    7 S1402048 13322252452 1.225790e+17 221.205.98.55
    8 S1405011 18922257681 1.225790e+17 183.184.230.38
    9 S1402048 13322252452 1.225790e+17 221.205.98.55
    10 S1405011 18922257681 1.225790e+17 183.184.230.38
    例中的2、3、5行有空值NaN已经被删除

    2. df.fillna() 用其他数值替代NaN,有些时候空数据直接删除会影响分析的结果,可以对数据进行填补。【例4-8】使用数值或者任意字符替代缺失值

    【例4-8】使用数值或者任意字符替代缺失值

    from pandas import DataFrame
    from pandas import read_excel
    df = read_excel('e://rz2.xlsx')
    df.fillna('?')
    

    Out[4]:
    YHM TCSJ YWXT IP DLSJ
    0 S1402048 1.89223e+10 1.22579e+17 221.205.98.55 2014-11-04 08:44:46
    1 S1411023 1.35223e+10 1.22579e+17 183.184.226.205 2014-11-04 08:45:06
    2 S1402048 1.34223e+10 ? 221.205.98.55 2014-11-04 08:46:39
    3 20031509 1.88223e+10 ? 222.31.51.200 2014-11-04 08:47:41

    4 S1405010 1.89223e+10 1.22579e+17 120.207.64.3 2014-11-04 08:49:03
    5 20140007 ? 1.22579e+17 222.31.51.200 2014-11-04 08:50:06
    6 S1404095 1.38223e+10 1.22579e+17 222.31.59.220 2014-11-04 08:50:02
    7 S1402048 1.33223e+10 1.22579e+17 221.205.98.55 2014-11-04 08:49:18
    8 S1405011 1.89223e+10 1.22579e+17 183.184.230.38 2014-11-04 08:14:55
    9 S1402048 1.33223e+10 1.22579e+17 221.205.98.55 2014-11-04 08:49:18
    10 S1405011 1.89223e+10 1.22579e+17 183.184.230.38 2014-11-04 08:14:55
    如2、3、5行有空,用?替代了缺失值。

    3. df.fillna(method=‘pad’) 用前一个数据值替代NaN

    【例4-9】用前一个数据值替代缺失值
    (2、3、5行是缺失值)

    from pandas import DataFrame
    from pandas import read_excel
    df = read_excel('e://rz2.xlsx')
    df.fillna(method='pad')
    

    Out[5]:
    YHM TCSJ YWXT IP DLSJ
    0 S1402048 18922254812 1.225790e+17 221.205.98.55 2014-11-04 08:44:46
    1 S1411023 13522255003 1.225790e+17 183.184.226.205 2014-11-04 08:45:06
    2 S1402048 13422259938 1.225790e+17 221.205.98.55 2014-11-04 08:46:39
    3 20031509 18822256753 1.225790e+17 222.31.51.200 2014-11-04 08:47:41

    4 S1405010 18922253721 1.225790e+17 120.207.64.3 2014-11-04 08:49:03
    5 20140007 18922253721 1.225790e+17 222.31.51.200 2014-11-04 08:50:06
    6 S1404095 13822254373 1.225790e+17 222.31.59.220 2014-11-04 08:50:02
    7 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
    8 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
    9 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
    10 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55

    4. df.fillna(method=‘bfill’) 用后一个数据值替代NaN

    【例4-10】用后一个数据值替代NaN
    (2、3、5行是缺失值)

    from pandas import DataFrame
    from pandas import read_excel
    df = read_excel('e://rz2.xlsx')
    df.fillna(method='bfill')
    

    Out[6]:
    YHM TCSJ YWXT IP DLSJ
    0 S1402048 18922254812 1.225790e+17 221.205.98.55 2014-11-04 08:44:46
    1 S1411023 13522255003 1.225790e+17 183.184.226.205 2014-11-04 08:45:06
    2 S1402048 13422259938 1.225790e+17 221.205.98.55 2014-11-04 08:46:39
    3 20031509 18822256753 1.225790e+17 222.31.51.200 2014-11-04 08:47:41

    4 S1405010 18922253721 1.225790e+17 120.207.64.3 2014-11-04 08:49:03
    5 20140007 13822254373 1.225790e+17 222.31.51.200 2014-11-04 08:50:06
    6 S1404095 13822254373 1.225790e+17 222.31.59.220 2014-11-04 08:50:02
    7 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
    8 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55
    9 S1402048 13322252452 1.225790e+17 221.205.98.55 2014-11-04 08:49:18
    10 S1405011 18922257681 1.225790e+17 183.184.230.38 2014-11-04 08:14:55

    5. df.fillna(df.mean()) 用平均数或者其他描述性统计量来代替NaN。

    【例4-11】使用均值来填补数据。

    from pandas import DataFrame
    from pandas import read_excel
    df = read_excel('e://rz2_0.xlsx')
    df
    
    df.fillna(df.mean())
    

    Out[7]:
    No math physical Chinese
    0 1 76 85 78
    1 2 85 56 NaN
    2 3 76 95 85
    3 4 NaN 75 58
    4 5 87 52 68

    Out[8]:
    No math physical Chinese
    0 1 76 85 78.00
    1 2 85 56 72.25
    2 3 76 95 85.00
    3 4 81 75 58.00
    4 5 87 52 68.00

    6. df.fillna(df.mean()[math: physical]) 可以选择列进行缺失值的处理

    【例4-12】为某列使用该列的均值来填补数据

    from pandas import DataFrame
    from pandas import read_excel
    df = read_excel('e://rz2_0.xlsx')
    df.fillna(df.mean()['math':'physical'])
    

    Out[26]:
    No math physical Chinese
    0 1 76.0 85 78.0
    1 2 85.0 56 NaN
    2 3 76.0 95 85.0
    3 4 NaN 75 58.0
    4 5 87.0 52 68.0

    Out[9]:
    No math physical Chinese
    0 1 76 85 78
    1 2 85 56 NaN
    2 3 76 95 85
    3 4 81 75 58
    4 5 87 52 68

    7. strip():清除字符型数据左右(首尾)指定的字符,默认为空格,中间的不清除。

    【例4-13】删除字符串左右或首位指定的字符。

    from pandas import DataFrame
    from pandas import read_excel
    df = read_excel('e://rz2.xlsx')
    newDF=df['IP'].str.strip()    #因为IP是一个对象,所以先转为str。
    newDF
    

    Out[27]:
    YHM TCSJ YWXT IP DLSJ
    0 S1402048 18922254812.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:44:46
    1 S1411023 13522255003.0 1.2257903137349373e+17 183.184.226.205 2014-11-04 08:45:06
    2 S1402048 13422259938.0 221.205.98.55 2014-11-04 08:46:39
    3 20031509 18822256753.0 222.31.51.200 2014-11-04 08:47:41
    4 S1405010 18922253721.0 1.2257903137349373e+17 120.207.64.3 2014-11-04 08:49:03
    5 20140007 1.2257903137349373e+17 222.31.51.200 2014-11-04 08:50:06
    6 S1404095 13822254373.0 1.2257903137349373e+17 222.31.59.220 2014-11-04 08:50:02
    7 S1402048 13322252452.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:49:18
    8 S1405011 18922257681.0 1.2257903137349373e+17 183.184.230.38 2014-11-04 08:14:55
    9 S1402048 13322252452.0 1.2257903137349373e+17 221.205.98.55 2014-11-04 08:49:18
    10 S1405011 18922257681.0 1.2257903137349373e+17 183.184.230.38 2014-11-04 08:14:55

    Out[10]:
    0 221.205.98.55
    1 183.184.226.205
    2 221.205.98.55
    3 222.31.51.200
    4 120.207.64.3
    5 222.31.51.200
    6 222.31.59.220
    7 221.205.98.55
    8 183.184.230.38
    9 221.205.98.55
    10 183.184.230.38
    Name: IP, dtype: object

    3、特定值替换:replace(‘缺考’, 0)

    df11 = df11.replace(np.nan,'[正常]')
    df11 = df11.replace('none',np.nan)
    df11 = df11.replace(' ― ',np.nan)
    

    4、删除满足条件元素所在的行:drop()

    df = df.drop(df[].index)

    #删除价格大于1000的手机

    df_s_acc = df_s.drop(df_s[df_s['价格']>=1000].index) 
    

    Out[68]:
    Unnamed: 0 ID值 价格 … 标签 变更 规范日期
    5566 6626 1354676 699 … 安全手机 2020/11/1 2020-11-01
    5565 6625 1354673 799 … 安全手机 2020/11/1 2020-11-01
    101 102 1346463 2699 … 安全手机 2020/11/11 2020-11-11
    64 64 1338710 3199 … 安全手机 2020/11/11 2020-11-11
    2884 3382 1352445 1499 … 安全手机 2020/11/26 2020-11-26
    2892 3391 1349515 1099 … 安全手机 2020/11/26 2020-11-26
    2910 3411 1349516 1299 … 安全手机 2020/11/26 2020-11-26

    2844 3340 1348871 999 … 安全手机 2020/11/26 2020-11-26
    4046 4845 1350884 799 … 安全手机 2020/12/1 2020-12-01
    4036 4834 1350882 699 … 安全手机 2020/12/1 2020-12-01
    3394 4023 1349976 799 … 安全手机 2020/12/12 2020-12-12
    4740 5656 1353088 2399 … 安全手机 2020/12/22 2020-12-22
    4737 5653 1353068 1999 … 安全手机 2020/12/22 2020-12-22
    4048 4847 1357947 1099 … 安全手机 2021/1/1 2021-01-01

    4038 4836 1357933 999 … 安全手机 2021/1/1 2021-01-01
    4043 4842 1357949 1199 … 安全手机 2021/1/1 2021-01-01

    Out[72]:
    Unnamed: 0 ID值 价格 … 标签 变更 规范日期
    5566 6626 1354676 699 … 安全手机 2020/11/1 2020-11-01
    5565 6625 1354673 799 … 安全手机 2020/11/1 2020-11-01
    2844 3340 1348871 999 … 安全手机 2020/11/26 2020-11-26
    4046 4845 1350884 799 … 安全手机 2020/12/1 2020-12-01
    4036 4834 1350882 699 … 安全手机 2020/12/1 2020-12-01
    3394 4023 1349976 799 … 安全手机 2020/12/12 2020-12-12
    4038 4836 1357933 999 … 安全手机 2021/1/1 2021-01-01

    也可以使用多个条件

    df_clear = df.drop(df[df['x']<0.01].index)
    # 也可以使用多个条件
    df_clear = df.drop(df[(df['x']<0.01) | (df['x']>10)].index) #删除x小于0.01或大于10的行
    
    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python数据处理篇——DataFrame数据清洗】重复值处理、缺失值处理、特定值替换、删除指定条件行

    发表评论