美文网首页Coding
数据分析之 Pandas

数据分析之 Pandas

作者: AaronYu__ | 来源:发表于2018-12-27 19:08 被阅读4次

    上一次我分享了 Numpy 的学习心得,没看过的朋友点这里 numpy

    这次我们学习另一个非常重要的工具 Pandas,很多小伙伴可能已经听说过 pandas 了,pandas 是基于 numpy 构建的含有更高级数据结构和分析能力的工具包,功能更强大,我们趁热打铁,在学完上面的 Numpy 后把 pandas 学到手。

    pandas 有两种数据结构:Series 和 DataFrme

    Series 是个定长的字典序列,在存储的时候相当于两个 ndarray。Series有两个基本属性:index 和 values, index 默认是 0, 1, 2.....,我们也可以自己指定比如:index = ['a', 'b', 'c', 'd']

    import pandas as pd
    from pandas import Series, DataFrame
    
    a = Series([1, 2, 3, 4])
    c = Series(data=(1, 2, 3, 4), index=['a', 'b', 'c', 'd'])
    print(a)
    print(c)
    

    输出结果

    0    1
    1    2
    2    3
    3    4
    dtype: int64
    a    1
    b    2
    c    3
    d    4
    dtype: int64
    

    我们也可以像创建字典一样创建 Series

    f = {'a':1, 'b': 2, 'c': 3}
    x1 = Series(f)
    print(x1)
    
    a    1
    b    2
    c    3
    dtype: int64
    

    DataFrame 包含了行索引和列索引,类似于数据库表。

    期末了,我们虚构几个同学考试的场景,输出考试成绩。

    import pandas as pd
    from pandas import Series, DataFrame
    data = {'Chinese': [68, 88, 78, 98], 'Math': [14, 67, 88, 65], 
    'English': [100, 55, 87, 98]}
    df1 = DataFrame(data)
    df2 = DataFrame(data, index=['Zhangsan', 'Lisi', 'Wangwu', 'Zhaoliu'])
    print(df1)
    print(df2)
    
    

    output

     Chinese  Math  English
    0       68    14      100
    1       88    67       55
    2       78    88       87
    3       98    65       98
              Chinese  Math  English
    Zhangsan       68    14      100
    Lisi           88    67       55
    Wangwu         78    88       87
    Zhaoliu        98    65       98
    

    df2 中,行索引是 ['Zhangsan', 'Lisi', 'Wangwu', 'Zhaoliu'],列索引是 ['Chinese', 'Math', 'English']。

    数据清洗

    数据清洗是数据处理过程中必不可少的环节,Pandas 为我们提供了许多工具,这里我简单介绍下 Pandas 数据清洗的工具。

    以上面考试做例子。

    data = {'Chinese': [68, 88, 78, 98], 'Math': [14, 67, 88, 65],
     'English': [100, 55, 87, 98]}
    df = DataFrame(data, index=['Zhangsan', 'Lisi', 'Wangwu', 'Zhaoliu'], 
    columns=['English', 'Math', 'Chinese'])
    print(df)
    
              English  Math  Chinese
    Zhangsan      100    14       68
    Lisi           55    67       88
    Wangwu         87    88       78
    Zhaoliu        98    65       98
    
    1. 删除某行或某列

    比如把 '语文' 这列删掉。把 " Zhangsan " 这行删掉

    df = df.drop(columns=['Chinese'])
    df = df.drop(index=['Zhangsan'])
    
    重命名列名 columns
    df.rename(columns={'Chinese': '语文'}, inplace=True)
    
    去除重复的值
    df = df.drop_duplicates()
    
    格式问题
    # 更改数据格式
    df["Chinese"].astype('str')
    df["Chinese"].astype(np.int64)
    
    # 删除数据间的空格
    df['Chinese'] = df2['Chinese'].map(str.strip) # 删除左右两边空格
    df['Chinese'] = df2['Chinese'].map(str.lstrip) # 删除左边空格
    df['Chinese'] = df2['Chinese'].map(str.rstrip) # 删除右边空格
    
    
    df['Chinese'] = df2['Chinese'].str.strip('$') 
    # 去除特殊符号
    
    大小写转换
    # 全部大写
    df.columns = df.columns.str.upper()
    # 全部小写
    df.columns = df.columns.str.lower()
    # 首字母大写
    df.columns = df.columns.str.title()
    
    查找空值

    有些字段可能存在空值,我们需要用 pandas 的 isnull 函数进行查找。
    比如下面这个数据表

             English  Math  Chinese
    Zhangsan      100   NaN       68
    Lisi           55  67.0       88
    Wangwu         87  88.0       78
    Zhaoliu        98  65.0       98
    

    我们用 df.isnull() 查看哪里出现空值,用 df.isnull().any() 查看那一列出现空值。

    print(df.isnull())
    
              English   Math  Chinese
    Zhangsan    False   True    False
    Lisi        False  False    False
    Wangwu      False  False    False
    Zhaoliu     False  False    False
    

    可以看到第一行第二列出现空值

    print(df.isnull().any())
    
    English    False
    Math        True
    Chinese    False
    dtype: bool
    

    数学这一列出现空值

    使用 apply 函数进行清洗

    比如对 name 列的数值进行大写转化

    df['name'] = df['name'].apply(str.upper)
    

    比如对某一列的数值 * 3 倍返回。

    def triple_df(x):
        return 3 *x
    df['Chinese'] = df['Chinese'].apply(triple_df)
    print(df)
    
              English  Math  Chinese
    Zhangsan      100    78      204
    Lisi           55    67      264
    Wangwu         87    88      234
    Zhaoliu        98    65      294
    

    定义更复杂的函数,我们新增两列,其中 'new1' 是 " Chinese " 和 " Math " 之和的 m 倍, 'new2' 是 " Chinese " 和 " Math " 之和的 n 倍。

    def plus(df, n, m):
        df['new1'] = (df['Chinese'] + df['Math']) * m
        df['new2'] = (df['Chinese'] + df['Math']) * n
        return df
    
    df = df.apply(plus, axis=1, args=(2, 3))
    print(df)
    
           English  Math  Chinese  new1  new2
    Zhangsan      100    78       68   438   292
    Lisi           55    67       88   465   310
    Wangwu         87    88       78   498   332
    Zhaoliu        98    65       98   489   326
    
    数据统计

    我们直接用 describe() 函数,可以对数据进行全面的了解。

    print(df.describe()) 
    
           English       Math    Chinese
    count    4.000000   4.000000   4.000000
    mean    85.000000  74.500000  83.000000
    std     20.800641  10.661457  12.909944
    min     55.000000  65.000000  68.000000
    25%     79.000000  66.500000  75.500000
    50%     92.500000  72.500000  83.000000
    75%     98.500000  80.500000  90.500000
    max    100.000000  88.000000  98.000000
    
    练习题

    学了后一定要练习,练习,练习,你才能够成长。
    对于下表数据,请使用 Pandas 中的 DataFrame 进行创建,并对数据进行清洗。同时新加一列求每个人的三科成绩。(尽可能用到所有知识)

    练习题

    在评论区与我分享你的答案。

    相关文章

      网友评论

        本文标题:数据分析之 Pandas

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