pandas 库简介

作者: 苍简 | 来源:发表于2019-02-28 21:12 被阅读20次

    上周分享了数据分析用到的一个库:Numpy 库,今天分享一个比 Numpy 更高效的库:pandas,它可以对数据进行导入、清洗、处理、统计和输出。pandas 是基于 Numpy 库的,可以说,pandas 库就是为数据分析而生的。

    环境

    语言:Python 3.6

    安装&导入

    用 pip 命令快速安装 pandas 库。

    pip install pandas
    

    安装完后再编辑器中导入。

    import pandas as pd
    

    读取文件

    读取你的 excel 文件,并另存为 csv 格式的文件。

    import pandas as pd
    from pandas import DataFrame, Series
    
    df = DataFrame(pd.read_excel('test.xlsx'))
    df.to_csv('test1.csv')
    print(df)
    

    读取过程中可能会报错,提示你缺少 xlrd 模块的情况,用 pip 命令安装即可。

    打印出读取到的数据,我们发现,文件中单元格为空的数据以 NAN 代替了。

    当然,也可以直接读取文件并打印,不给参数的话默认只打印前 5 行数据。以我之前爬取的热门歌手文件为例。

    import pandas as pd
    from pandas import DataFrame, Series
    
    df = DataFrame(pd.read_excel('歌手.xlsx'))
    print(df.head(8))
    

    打印结果如下:

      歌手名字  歌手ID
    0  周杰伦  6452
    1  陈奕迅  2116
    2  薛之谦  5781
    3  林俊杰  3684
    4  李荣浩  4292
    5  张学友  6460
    6  杨宗纬  6066
    7   许巍  5770
    

    清洗数据

    我们知道,从事数据分析工作的,80% 的时间都花在数据清洗上面,因为我们从各个渠道获取的信息格式不统一,我们需要对他们进行清洗。

    清洗数据主要内容如下:

    • 删除 DataFrame 中的不必要列和行。

    • 重命名 columns 为一组更易识别的标签。

    • 更改数据格式。

    • 去除数据间空格或者特定字符。

    • 去除重复的行。

    • 查找空值。

    删除行或者列

    我们还是以刚才歌手信息为例,为了看删除效果,我加了一列信息:性别,下面只显示部分信息。

      歌手名字  歌手ID 性别
    0  周杰伦    6452   男
    1  陈奕迅    2116   男
    2  薛之谦    5781   男
    3  林俊杰    3684   男
    4  李荣浩    4292   男
    5  张学友    6460   男
    6  杨宗纬    6066   男
    7   许巍     5770   男
    

    删除性别这一列。

    import pandas as pd
    from pandas import DataFrame, Series
    
    df = DataFrame(pd.read_excel('歌手.xlsx'))
    df1 = df.drop(columns=['性别'])
    print(df1)
    

    执行后发现刚加的「性别」这一列已被删除。

    删除某一行,比如删除李荣浩这一行信息,我们通过上面可以知道这一行的 index 是 4。

    import pandas as pd
    from pandas import DataFrame, Series
    
    df = DataFrame(pd.read_excel('歌手.xlsx'))
    df1 = df.drop(index=['李荣浩'])
    print(df1)
    

    执行后结果如下,我们发现,index 为 4 的这一行信息已被删除。

       歌手名字  歌手ID   性别 
    0   周杰伦    6452    男
    1   陈奕迅    2116    男
    2   薛之谦    5781    男
    3   林俊杰    3684    男
    5   张学友    6460    男
    6   杨宗纬    6066    男
    7    许巍     5770    男
    
    重命名列名

    用 rename 方法将列名修改成自己需要的列名,比如歌手名字换成 SName。

    import pandas as pd
    from pandas import DataFrame, Series
    
    df = DataFrame(pd.read_excel('歌手.xlsx'))
    df.rename(columns={'歌手名字': 'SName'}, inplace=True)
    print(df)
    
    更改数据格式

    用 astype 更改数据格式。

    df = DataFrame(pd.read_excel('歌手.xlsx'))
    df1 = df['歌手ID'].astype('str')
    
    删除数据间空格
    df = DataFrame(pd.read_excel('歌手.xlsx'))
    df['歌手名字'] = df['歌手名字'].map(str.strip)  # 删除左右两边空格
    df['歌手名字'] = df['歌手名字'].map(str.lstrip)  # 删除左边空格
    df['歌手名字'] = df['歌手名字'].map(str.rstrip)  # 删除右边空格
    

    去除重复的行

    用自带的方法一行代码可以搞定。

    df = DataFrame(pd.read_excel('歌手.xlsx'))
    df = df.drop_duplicates()
    
    查找空值

    我们可以用 isnull 方法查找数据中的空值或者 NAN,返回的是 Boolean 类型,False 表示不是空值,True 表示空值。

    df = DataFrame(pd.read_excel('歌手.xlsx'))
    df = df.isnull()
    print(df)
    

    为了展示效果,我执行前去掉了第 5 行的信息,所以第 5 行出现一个 True。

         歌手名字  歌手ID
    0      False    False
    1      False    False
    2      False    False
    3      False    False
    4      True     False
    

    数据统计

    上周讲 Numpy 库时也讲到了对数据的统计,计算数据最大值、最小值、平均值、方差、标准差等。pandas 也可以做这些工作,而且 pandas 中的 describe 可以直接显示这个数据。

    我们先创建一个科目成绩的数据。

    df = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
    print(df)
    

    数据如下:

      subject  data
    0       语    90
    1       数    91
    2       外    92
    3       理    93
    4       化    94
    

    我们用 describe 方法直接显示这些统计数据。

    df = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
    print(df.describe())
    

    结果如下:

                data
    count   5.000000
    mean   92.000000
    std     1.581139
    min    90.000000
    25%    91.000000
    50%    92.000000
    75%    93.000000
    max    94.000000
    

    多表合并

    如果我们有多个数据表,我们需要对他进行合并处理。以下这些知识点和 SQL 很相似,如果你对 SQL 语句熟悉的话,以下很容易理解

    对相同的列进行合并
    df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
    df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
    df3 = pd.merge(df1, df2, on='subject')
    print(df3)
    

    两个表中,语数外是相同的,进行合并,结果如下:

      subject  data_x  data_y
    0       语      90      90
    1       数      91      91
    2       外      92      92
    
    内连接

    也就是两个数据表中的交集部分。

    df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
    df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
    df3 = pd.merge(df1, df2, how='inner')
    print(df3)
    

    结果显示两个表中相同的数据。

      subject  data
    0       语    90
    1       数    91
    2       外    92
    
    左连接

    以左表为主,右表只显示交集部分的数据。

    df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
    df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
    df3 = pd.merge(df1, df2, how='left')
    print(df3)
    

    执行结果:

      subject  data
    0       语    90
    1       数    91
    2       外    92
    3       理    93
    4       化    94
    
    右连接

    以右表为主,左表只显示交集部分的数据。

    df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
    df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
    df3 = pd.merge(df1, df2, how='right')
    print(df3)
    

    执行结果:

      subject  data
    0       语    90
    1       数    91
    2       外    92
    3       史    93
    4       地    94
    
    全连接

    显示两个表数据的并集。

    df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
    df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
    df3 = pd.merge(df1, df2, how='outer')
    print(df3)
    

    执行结果:

      subject  data
    0       语    90
    1       数    91
    2       外    92
    3       理    93
    4       化    94
    5       史    93
    6       地    94
    

    pandas 库的对于数据分析的基本用法就介绍到这里。

    相关文章

      网友评论

        本文标题:pandas 库简介

        本文链接:https://www.haomeiwen.com/subject/dwqluqtx.html