04-pandas-Ⅲ

作者: 郑元吉 | 来源:发表于2018-12-14 19:29 被阅读5次

    一.pandas数据处理

    1.删除重复元素
    import numpy as np
    import pandas as pd
    from pandas import DataFrame, Series
    
    def mk_df(inds, cols):
        data = {col: [col + str(i) for i in inds]  for col in cols}
        return DataFrame(data=data, index=inds, columns=cols)
    
    • 使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True
    df1 = mk_df([1,2,3,4], list('ABCD'))
    df1
    输出:
        A   B   C   D
    1   A1  B1  C1  D1
    2   A2  B2  C2  D2
    3   A3  B3  C3  D3
    4   A4  B4  C4  D4
    
    # 生成重复行
    df1.loc[1] = df1.loc[2]
    df1
    输出:
        A   B   C   D
    1   A2  B2  C2  D2
    2   A2  B2  C2  D2
    3   A3  B3  C3  D3
    4   A4  B4  C4  D4
    
    # 使用duplicated检查是否有重复的行
    df1.duplicated()
    输出:
    1    False
    2     True
    3    False
    4    False
    dtype: bool
    # keep 从后往前检查是否有重复行
    df1.duplicated(keep='last')
    输出:
    1     True
    2    False
    3    False
    4    False
    dtype: bool
    
    • 使用drop_duplicates()函数删除重复的行
    df1.drop_duplicates(keep='last')
    输出:
        A   B   C   D
    2   A2  B2  C2  D2
    3   A3  B3  C3  D3
    4   A4  B4  C4  D4
    
    2.映射

    映射的含义:创建一个映射关系列表,把values元素和一个特定的标签或者字符串绑定
    需要使用字典:
    map = {
    'label1':'value1',
    'label2':'value2',
    ...
    }
    包含三种操作:

    • replace()函数:替换元素
    • 最重要:map()函数:新建一列
    • rename()函数:替换索引
    1) replace()函数:替换元素

    使用replace()函数,对values进行替换操作

    data = np.random.randint(0,150,size=(4,4))
    index = ['张三', '李四', '王五', '赵六']
    columns = ['语文', '数学', '英语', 'python']
    ddd = DataFrame(data=data,index=index, columns=columns)
    ddd
    输出:
    
         语文   数学   英语   python   
    张三   8    144    106     21         
    李四  78.0   22     37     82    
    王五  17.0    8     29     75      
    赵六   84.0  12    134     19   
    
    首先定义一个字典
    # 定义一个映射的字典
    dic = {8: 80, 12: 120, 17: 71, 19:91}
    调用.replace()
    ddd.replace(dic)
    输出:
         语文   数学   英语   python
    张三  80    144    106     21
    李四  78     22     37     82
    王五  71     80     29     75
    赵六  84    120    134     91
    

    replace还经常用来替换NaN元素

    ddd
    输出:
         语文   数学   英语   python   
    张三  NaN   144    106     21         
    李四  78.0   22     37     82    
    王五  17.0    8     29     75      
    赵六   84.0  12    134     19   
    
    dic = {np.nan: 0}
    ddd.replace(dic)
    输出:
         语文   数学   英语   python   
    张三  0.0   144    106     21         
    李四  78.0   22     37     82    
    王五  17.0    8     29     75      
    赵六   84.0  12    134     19       
    
    
    2) map()函数:新建一列

    使用map()函数,由已有的列生成一个新列,适合处理某一单独的列。

    ddd
    输出:
         语文   数学   英语   python   
    张三  NaN   144    106     21         
    李四  150.0  22     37     82    
    王五  17.0   29    300     16      
    赵六   84.0  12    134     19       
    
    仍然是新建一个字典
    dic = {144: 144*2, 22:22*2, 8: 8*2, 12: 12*2}
    ddd['理综'] = ddd['数学'].map(dic)
    ddd
    输出:
         语文   数学   英语   python   理综 
    张三  NaN   144    106     21      288    
    李四  150.0  22     37     82       44    
    王五  17.0   29    300     16       58
    赵六   84.0  12    134     19       24    
    

    map()函数中可以使用lambda函数

    # 使用已有的值,修改已有的列 ,map不光可以新建一列,也可以修改已有列的数据
    ddd['理综'] = ddd['数学'].map(lambda item: item*2)
    ddd
    输出:
         语文   数学   英语   python   理综 
    张三  NaN   144    106     21      288    
    李四  150.0  22     37     82       44    
    王五  17.0   29    300     16       58
    赵六   84.0  12    134     19       24    
    
    # 给map传一个函数
    def convert(item):
        if item > 200:
            return '优秀'
        elif item > 80:
            return '及格'
        else:
            return '不及格'
    ddd['理综成绩'] = ddd['python'].map(convert)
    ddd
    输出:
         语文   数学  英语  python  理综  理综成绩
    张三  NaN   144   106    21     288   不及格
    李四  150.0  22    37    82      44     及格
    王五  17.0   29   300    16      58     优秀
    赵六  84.0   12   134    19      24   不及格
    
    3) rename()函数:替换索引
    ddd
    输出:
         语文 数学 英语 python score
    张三  61  146  13   45    failed
    李四  89  68   121  128   excellent
    王五  89  13   42    2    failed
    赵六  129 139  95   98    pass
    
    仍然是新建一个字典
    dic = {'语文': 'Chinese', '数学': 'Math', '英语': 'English'}
    ddd.rename(columns=dic, axis=1)
    输出:
        Chinese  Math  English  python  score
    张三  61     146     13       45    failed
    李四  89     68      121      128   excellent
    王五  89     13      42        2    failed
    赵六  129    139     95        98   pass
    
    使用rename()函数替换行索引
    dic = {'张三': 'Zhangs Sir', '李四': 'Li Sir', '王五': 'LaoWang', '赵六': 'Mr Six'}
    ddd.rename(index=dic)
    输出:
               语文   数学  英语  python  score
    Zhangs Sir  61   146    13    45    failed
    Li Sir      89   68    121   128     excellent
    LaoWang     89   13     42    2     failed
    Mr Six     129  139     95    98    pass
    
    3. 异常值检测和过滤

    使用describe()函数查看每一列的描述性统计量

    ddd
    输出:
        语文  数学  英语  python  
    张三  61  146   13    45
    李四  89  68   121    128
    王五  89  13    42    2   
    赵六  129 139   95    98
    
    # 描述性的统计量
    ddd.describe()
    输出:
            语文       数学       英语      python
    count  4.00000    4.000000  4.000000   4.000000
    mean   92.00000   91.500000 67.750000  68.250000
    std    27.97618   63.089883 49.121448  55.930761
    min    61.00000   13.000000 13.000000   2.000000
    25%    82.00000   54.250000 34.750000  34.250000
    50%    89.00000  103.500000 68.500000  71.500000
    75%    99.00000  140.750000 101.500000 105.500000
    max   129.00000  146.000000 121.000000 128.000000
    

    使用std()函数可以求得DataFrame对象每一列的标准差

    ddd.std()
    输出:
    语文        27.976180
    数学        63.089883
    英语        49.121448
    python      55.930761
    dtype: float64
    

    根据每一列的标准差,对DataFrame元素进行过滤。
    借助any()函数, 测试是否有True,有一个或以上返回True,反之返回False
    对每一列应用筛选条件,去除标准差太大的数据

    cond = (ddd > 3.5 * ddd.std(axis=0)).any(axis=1)
    ddd[~cond]
    输出:
        语文  数学  英语  python
    张三  61  146   13    45
    李四  89  68   121    128
    王五  89  13    42    2
    
    4. 排序

    使用.take()函数排序
    可以借助np.random.permutation()函数随机排序

    ddd
    输出:
        语文  数学  英语  python
    张三  61  146 13  45
    李四  89  68  121 128
    王五  89  13  42  2
    赵六  129 139 95  98
    
    # take就是按照我们给定的index顺序来显示数据.
    ddd.take([3,2,1,0])
    输出:
        语文  数学  英语  python
    赵六  129 139 95  98
    王五  89  13  42  2
    李四  89  68  121 128
    张三  61  146 13  45
    
    ddd.take([3,2])
    输出:
        语文  数学  英语  python
    赵六 129  139   95      98
    王五  89   13   42       2
    
    # 通过axis来控制拿的数据是行还是列.
    ddd.take([3,2], axis=1)
    输出:
        python 英语
    张三  45  13
    李四  128 121
    王五  2   42
    赵六  98  95
    
    np.random.permutation(4)
    输出:
    array([1, 0, 3, 2])
    # 数据没有重复, 叫做无放回抽样.
    ddd.take(np.random.permutation(4))
    输出:
        语文  数学  英语  python
    赵六 129  139   95      98
    李四  89   68   121     128
    王五  89   13   42       2
    张三  61  146   13      45
    
    • 随机抽样
      当DataFrame规模足够大时,直接使用np.random.randint()函数,就配合take()函数实现随机抽样
    # np.random.randint 配合take()实现的是有放回抽样.
    np.random.randint(0,4, size=4)
    输出:
    array([3, 2, 0,3])
    
    ddd.take(np.random.randint(0,4, size=4))
    输出:
        语文  数学  英语  python
    赵六 129  139   95      98
    王五  89   13   42       2
    张三  61  146   13      45
    赵六 129  139   95      98
    
    5. 数据聚合

    数据聚合是数据处理的最后一步,通常是要使每一个数组生成一个单一的数值。
    数据分类处理:

    • 分组:先把数据分为几组
    • 用函数处理:为不同组的数据应用不同的函数以转换数据
    • 合并:把不同组得到的结果合并起来
      数据分类处理的核心: groupby()函数
    df = DataFrame({'color':['red','white','red','cyan','cyan','green','white','cyan'],
                    'price':np.random.randint(0,8,size = 8),
                    'weight':np.random.randint(50,55,size = 8)})
    df
    输出:
        color     price    weight
    0   red         2        54
    1   white       6        50
    2   red         3        50
    3   cyan        0        51
    4   cyan        5        52
    5   green       5        51
    6   white       2        54
    7   cyan        7        53
    
    # 使用颜色对df进行分组
    # 第一步,进行分组
    df.groupby(by='color')
    # 返回的对象,你就把它当成一个DataFrame
    
    # 第二步使用聚合函数对分组之后的数据进行处理.
    # 先计算,再从计算的结果中取数据.
    df.groupby(by='color').sum()[['price']]
    输出:
          price
    color   
    cyan    12
    green   5
    red     5
    white   8
    
    # 这种方式先取数据,再计算. 推荐先取数据,在计算,会性能高一些,更快一些.
    price_sum = df.groupby(by='color')[['price']].sum()
    price_sum
    输出:
          price
    color   
    cyan    12
    green   5
    red     5
    white   8
    
    df.merge(price_sum, left_on='color', right_index=True, suffixes=['', '_sum'])
    输出:
        color   price   weight  price_sum
    0   red       2          5       5
    2   red       3          50      5
    1   white     6          50      8
    6   white     2          54      8
    3   cyan      0          51      12
    4   cyan      5          52      12
    7   cyan      7          53      12
    5   green     5          51       5
    

    相关文章

      网友评论

        本文标题:04-pandas-Ⅲ

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