• 数据可视化基础专题(八):Pandas基础(七) 数据清洗与预处理相关


    1.数据概览

    第一步当然是把缺失的数据找出来, Pandas 找缺失数据可以使用 info() 这个方法(这里选用的数据源还是前面一篇文章所使用的 Excel ,小编这里简单的随机删除掉几个数据)

    import pandas as pd
    
    # 相对路径
    df = pd.read_excel("result_data.xlsx")
    print(df)
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog     215.0         0     118.0         0 2019-11-23 23:00:10
    1      juejin       NaN         0      -2.0         1 2019-11-23 23:00:03
    2        csdn    1652.0        69       0.0        24 2019-11-23 23:00:02
    3      cnblog     650.0         3       NaN         0 2019-11-22 23:00:15
    4      juejin     272.0         3     -23.0         1 2019-11-22 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    403    juejin     212.0         0      -1.0         2 2020-02-20 23:00:02
    404      csdn    1602.0         1       0.0         1 2020-02-20 23:00:01
    405    cnblog      19.0         0      41.0         0 2020-02-21 23:00:05
    406    juejin     125.0         1      -4.0         0 2020-02-21 23:00:02
    407      csdn    1475.0         8       0.0         3 2020-02-21 23:00:02
    
    [408 rows x 6 columns]
    
    print(df.info())
    
    # 输出结果
    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 408 entries, 0 to 407
    Data columns (total 6 columns):
    plantform      408 non-null object
    read_num       406 non-null float64
    fans_num       408 non-null int64
    rank_num       407 non-null float64
    like_num       408 non-null int64
    create_date    408 non-null datetime64[ns]
    dtypes: datetime64[ns](1), float64(2), int64(2), object(1)
    memory usage: 19.2+ KB

    我们还可以使用另一个更加直观的方式来获取缺失的数据 isnull() ,如果是缺失的值,会返回 True ,如果不是则会返回 False 

    import pandas as pd
    
    # 相对路径
    df = pd.read_excel("result_data.xlsx")
    print(df.isnull())
    
    # 输出结果
         plantform  read_num  fans_num  rank_num  like_num  create_date
    0        False     False     False     False     False        False
    1        False      True     False     False     False        False
    2        False     False     False     False     False        False
    3        False     False     False      True     False        False
    4        False     False     False     False     False        False
    ..         ...       ...       ...       ...       ...          ...
    403      False     False     False     False     False        False
    404      False     False     False     False     False        False
    405      False     False     False     False     False        False
    406      False     False     False     False     False        False
    407      False     False     False     False     False        False
    
    [408 rows x 6 columns]

    利用isnull().sum()可以直接显示每个列缺失的总数

    2.重命名列

    为了重命名列,我们将使用DataFrame的rename()方法,允许你以一个映射(这里是一个字典)重新标记一个轴。

     让我们开始定义一个字典来将现在的列名称(键)映射到更多的可用列名称(字典的值)。

    >>> new_names =  {'Unnamed: 0': 'Country',
    ...               '? Summer': 'Summer Olympics',
    ...               '01 !': 'Gold',
    ...               '02 !': 'Silver',
    ...               '03 !': 'Bronze',
    ...               '? Winter': 'Winter Olympics',
    ...               '01 !.1': 'Gold.1',
    ...               '02 !.1': 'Silver.1',
    ...               '03 !.1': 'Bronze.1',
    ...               '? Games': '# Games',
    ...               '01 !.2': 'Gold.2',
    ...               '02 !.2': 'Silver.2',
    ...               '03 !.2': 'Bronze.2'}

    我们在对象上调用rename()函数:

    >>> olympics_df.rename(columns=new_names, inplace=True)

    设置inplaceTrue可以让我们的改变直接反映在对象上。让我们看看是否正确:

    >>> olympics_df.head()
                       Country  Summer Olympics  Gold  Silver  Bronze  Total  
    0        Afghanistan (AFG)               13     0       0       2      2
    1            Algeria (ALG)               12     5       2       8     15
    2          Argentina (ARG)               23    18      24      28     70
    3            Armenia (ARM)                5     1       2       9     12
    4  Australasia (ANZ) [ANZ]                2     3       4       5     12
    
       Winter Olympics  Gold.1  Silver.1  Bronze.1  Total.1  # Games  Gold.2  
    0                0       0         0         0        0       13       0
    1                3       0         0         0        0       15       5
    2               18       0         0         0        0       41      18
    3                6       0         0         0        0       11       1
    4                0       0         0         0        0        2       3
    
       Silver.2  Bronze.2  Combined total
    0         0         2               2
    1         2         8              15
    2        24        28              70
    3         2         9              12
    4         4         5              12

    3.缺失数据处理

    3.1 删除

    我们找到了缺失的数据,接下来就是对这部分数据进行删除操作了, Pandas 同样为我们提供了一个现成的方法 dropna() 。

    dropna() 这个方法会默认删除缺失数据的行,就是这一行只要有缺失数据,整行都会删除:

    import pandas as pd
    
    # 相对路径
    df = pd.read_excel("result_data.xlsx")
    
    print(df.dropna())
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog     215.0         0     118.0         0 2019-11-23 23:00:10
    2        csdn    1652.0        69       0.0        24 2019-11-23 23:00:02
    4      juejin     272.0         3     -23.0         1 2019-11-22 23:00:02
    5        csdn    2202.0       129       0.0        37 2019-11-22 23:00:01
    7        csdn    1621.0        76       0.0        27 2019-11-21 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    403    juejin     212.0         0      -1.0         2 2020-02-20 23:00:02
    404      csdn    1602.0         1       0.0         1 2020-02-20 23:00:01
    405    cnblog      19.0         0      41.0         0 2020-02-21 23:00:05
    406    juejin     125.0         1      -4.0         0 2020-02-21 23:00:02
    407      csdn    1475.0         8       0.0         3 2020-02-21 23:00:02
    
    [405 rows x 6 columns]

    在删除缺失行的时候还会有一种情况,就是整行数据全都缺失,我们还可以只删除整行数据全缺失,如果只是有缺失值的数据保留,这时我们可以用到 dropna() 的一个参数 how="any" :

    import pandas as pd
    
    # 相对路径
    df = pd.read_excel("result_data.xlsx")
    
    print(df.dropna(how="any"))
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog     215.0         0     118.0         0 2019-11-23 23:00:10
    1      juejin       NaN         0      -2.0         1 2019-11-23 23:00:03
    2        csdn    1652.0        69       0.0        24 2019-11-23 23:00:02
    3      cnblog     650.0         3       NaN         0 2019-11-22 23:00:15
    4      juejin     272.0         3     -23.0         1 2019-11-22 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    403    juejin     212.0         0      -1.0         2 2020-02-20 23:00:02
    404      csdn    1602.0         1       0.0         1 2020-02-20 23:00:01
    405    cnblog      19.0         0      41.0         0 2020-02-21 23:00:05
    406    juejin     125.0         1      -4.0         0 2020-02-21 23:00:02
    407      csdn    1475.0         8       0.0         3 2020-02-21 23:00:02
    
    [408 rows x 6 columns]

    因为小编的数据没有整行缺失的,可以看到这里又打印了所有的数据。

    3.2 缺失数据填充

    fillna()

    import pandas as pd
    
    # 相对路径
    df = pd.read_excel("result_data.xlsx")
    
    print(df.fillna(0))
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog     215.0         0     118.0         0 2019-11-23 23:00:10
    1      juejin       0.0         0      -2.0         1 2019-11-23 23:00:03
    2        csdn    1652.0        69       0.0        24 2019-11-23 23:00:02
    3      cnblog     650.0         3       0.0         0 2019-11-22 23:00:15
    4      juejin     272.0         3     -23.0         1 2019-11-22 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    403    juejin     212.0         0      -1.0         2 2020-02-20 23:00:02
    404      csdn    1602.0         1       0.0         1 2020-02-20 23:00:01
    405    cnblog      19.0         0      41.0         0 2020-02-21 23:00:05
    406    juejin     125.0         1      -4.0         0 2020-02-21 23:00:02
    407      csdn    1475.0         8       0.0         3 2020-02-21 23:00:02
    
    [408 rows x 6 columns]

    上面的示例是将所有的缺失数据全都填充成了 0 ,但是如果我们只想填充其中的一列数据呢?

    import pandas as pd
    
    # 相对路径
    df = pd.read_excel("result_data.xlsx")
    
    print(df.fillna({'read_num': 10}))
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog     215.0         0     118.0         0 2019-11-23 23:00:10
    1      juejin      10.0         0      -2.0         1 2019-11-23 23:00:03
    2        csdn    1652.0        69       0.0        24 2019-11-23 23:00:02
    3      cnblog     650.0         3       NaN         0 2019-11-22 23:00:15
    4      juejin     272.0         3     -23.0         1 2019-11-22 23:00:02
    ..        ...       ...       ...       ...       ...                 ...
    403    juejin     212.0         0      -1.0         2 2020-02-20 23:00:02
    404      csdn    1602.0         1       0.0         1 2020-02-20 23:00:01
    405    cnblog      19.0         0      41.0         0 2020-02-21 23:00:05
    406    juejin     125.0         1      -4.0         0 2020-02-21 23:00:02
    407      csdn    1475.0         8       0.0         3 2020-02-21 23:00:02
    
    [408 rows x 6 columns]

    为了便于区分,小编这里只补充了 read_num 这一列,将默认填充数值补充成了 10 。

    4 重复数据处理

    如果要识别和删除DataFrame中的重复行,有两种方法可以提供帮助:duplicateddrop_duplicates。每个都将用于标识重复行的列作为参数。

    • duplicated 返回一个布尔向量,其长度为行数,表示行是否重复。
    • drop_duplicates 删除重复的行。

    默认情况下,重复集的第一个观察行被认为是唯一的,但每个方法都有一个keep参数来指定要保留的目标。

    • keep='first' (默认值):标记/删除重复项,第一次出现除外。
    • keep='last':标记/删除重复项,除了最后一次出现。
    • keep=False:标记/删除所有重复项。

    5 数据类型转化

    看下当前数据表中的数据类型,这里使用的 dtypes ,示例如下:

    import pandas as pd
    
    # 相对路径
    df = pd.read_excel("result_data.xlsx")
    print(df)
    
    # 输出结果
        plantform  read_num  fans_num  rank_num  like_num         create_date
    0      cnblog     215.0         0     118.0         0 2019-11-23 23:00:10
    1      cnblog     215.0         0     118.0         0 2019-11-23 23:00:10
    2      juejin       NaN         0      -2.0         1 2019-11-23 23:00:03
    3        csdn    1652.0        69       0.0        24 2019-11-23 23:00:02
    4      cnblog     650.0         3       NaN         0 2019-11-22 23:00:15
    ..        ...       ...       ...       ...       ...                 ...
    404    juejin     212.0         0      -1.0         2 2020-02-20 23:00:02
    405      csdn    1602.0         1       0.0         1 2020-02-20 23:00:01
    406    cnblog      19.0         0      41.0         0 2020-02-21 23:00:05
    407    juejin     125.0         1      -4.0         0 2020-02-21 23:00:02
    408      csdn    1475.0         8       0.0         3 2020-02-21 23:00:02
    
    print(df.dtypes)
    
    # 输出结果
    plantform              object
    read_num              float64
    fans_num                int64
    rank_num              float64
    like_num                int64
    create_date    datetime64[ns]
    dtype: object

    当然,我们如果想单独知道某一列的数据类型,也可以这么用:

    import pandas as pd
    
    # 相对路径
    df = pd.read_excel("result_data.xlsx")
    print(df['read_num'].dtypes)
    
    # 输出结果
    float64

    当我们需要转换数据类型的时候,可以使用 astype() 这个方法,在使用的时候讲需要转化的目标类型写在 astype() 后面括号里即可

    import pandas as pd
    
    # 相对路径
    df = pd.read_excel("result_data.xlsx")
    print(df['fans_num'].astype('float64'))
    
    # 输出结果
    0       0.0
    1       0.0
    2       0.0
    3      69.0
    4       3.0
           ... 
    404     0.0
    405     1.0
    406     0.0
    407     1.0
    408     8.0
    Name: fans_num, Length: 409, dtype: float64

    6 添加索引

    import pandas as pd
    
    df1 = pd.read_excel("demo.xlsx")
    df1.columns = ['编号', '序号', '姓名', '消费金额']
    print(df1)
    
    # 输出结果
       编号    序号  姓名  消费金额
    0  A2  1002  小王  2000
    1  A3  1003  小明  3000
    2  A4  1004  小朱  4000
    3  A5  1005  小黑  5000

     set_index() 这个方法,在括号中指明需要使用的列名即可:

    import pandas as pd
    
    df1 = pd.read_excel("demo.xlsx")
    print(df1.set_index('编号'))
    
    # 输出结果
          序号  姓名  消费金额
    编号                
    A2  1002  小王  2000
    A3  1003  小明  3000
    A4  1004  小朱  4000
    A5  1005  小黑  5000

    7.使用 .str() 方法来清洗 columns

    .str属性是pandas里的一种提升字符串操作速度的方法,并有大量的Python字符串或编译的正则表达式上的小操作,例如.split(),.replace(),和.capitalize()

    将我们数据中所有的某一列字符数据改成大写:

    data['movie_title'].str.upper()

    pandas.Series.str.extract 正则提取数据

    8.使用 DataFrame.applymap() 函数按元素的清洗整个数据集

    >>> def get_citystate(item):
    ...     if ' (' in item:
    ...         return item[:item.find(' (')]
    ...     elif '[' in item:
    ...         return item[:item.find('[')]
    ...     else:
    ...         return item

    pandas的applymap()只用一个参数,就是要应用到每个元素上的函数(callable)

    >>> towns_df = towns_df.applymap(get_citystate)
  • 相关阅读:
    【bzoj4917】Hash Killer IV 乱搞
    【bzoj2770】YY的Treap 权值线段树
    【bzoj4898】[Apio2017]商旅 Floyd+分数规划+Spfa
    【GXZ的原创】平衡树性能测试
    【bzoj2969】矩形粉刷 期望
    【bzoj3325】[Scoi2013]密码 逆模拟Manacher
    【bzoj4974】字符串大师 逆模拟KMP
    【bzoj4987】Tree 树形背包dp
    【bzoj3672】[Noi2014]购票 斜率优化dp+CDQ分治+树的点分治
    【bzoj4325】NOIP2015 斗地主(&“加强”版) 搜索
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/12671733.html
Copyright © 2020-2023  润新知