• python数据分析——pandas数据处理


    pandas数据处理

    1、删除重复元素

    使用duplicated()函数检测重复的行,返回元素为布尔类型的Series对象,每个元素对应一行,如果该行不是第一次出现,则元素为True

    - keep参数:指定保留哪一重复的行数据
    • 创建具有重复元素行的DataFrame
    In [1]:
    import numpy as np
    import pandas as pd
    from pandas import Series,DataFrame
    
    In [2]:
    #创建一个df
    np.random.seed(1)
    df = DataFrame(data=np.random.randint(0,100,size=(8,4)))
    df
    
    Out[2]:
     0123
    0 37 12 72 9
    1 75 5 79 64
    2 16 1 76 71
    3 6 25 50 20
    4 18 84 11 28
    5 29 14 50 68
    6 87 87 94 96
    7 86 13 9 7
    In [4]:
    #手动将df的某几行设置成相同的内容
    df.iloc[2] = [66,66,66,66]
    df.iloc[4] = [66,66,66,66]
    df.iloc[7] = [66,66,66,66]
    df
    
    Out[4]:
     0123
    0 37 12 72 9
    1 75 5 79 64
    2 66 66 66 66
    3 6 25 50 20
    4 66 66 66 66
    5 29 14 50 68
    6 87 87 94 96
    7 66 66 66 66
    • 使用duplicated查看所有重复元素行
    In [7]:
    df.duplicated(keep='last')
    
    Out[7]:
    0    False
    1    False
    2     True
    3    False
    4     True
    5    False
    6    False
    7    False
    dtype: bool
    In [11]:
    indexs = df.loc[df.duplicated(keep='last')].index
    df.drop(labels=indexs,axis=0)
    
    Out[11]:
     0123
    0 37 12 72 9
    1 75 5 79 64
    3 6 25 50 20
    5 29 14 50 68
    6 87 87 94 96
    7 66 66 66 66
    • 删除重复元素的行
    • 使用drop_duplicates()函数删除重复的行
      • drop_duplicates(keep='first/last'/False)
    In [13]:
    df.drop_duplicates(keep='last')
    
    Out[13]:
     0123
    0 37 12 72 9
    1 75 5 79 64
    3 6 25 50 20
    5 29 14 50 68
    6 87 87 94 96
    7 66 66 66 66

    2. 映射

    1) replace()函数:替换元素

    使用replace()函数,对values进行映射操作

    Series替换操作

    • 单值替换
      • 普通替换
      • 字典替换(推荐)
    • 多值替换
      • 列表替换
      • 字典替换(推荐)
    • 参数
      • to_replace:被替换的元素

    replace参数说明:

    • method:对指定的值使用相邻的值填充替换
    • limit:设定填充次数

    DataFrame替换操作

    • 单值替换
      • 普通替换: 替换所有符合要求的元素:to_replace=15,value='e'
      • 按列指定单值替换: to_replace={列标签:替换值} value='value'
    • 多值替换
      • 列表替换: to_replace=[] value=[]
      • 字典替换(推荐) to_replace={to_replace:value,to_replace:value}
    In [14]:
    df
    
    Out[14]:
     0123
    0 37 12 72 9
    1 75 5 79 64
    2 66 66 66 66
    3 6 25 50 20
    4 66 66 66 66
    5 29 14 50 68
    6 87 87 94 96
    7 66 66 66 66
    In [15]:
    df.replace(to_replace=66,value=666)
    
    Out[15]:
     0123
    0 37 12 72 9
    1 75 5 79 64
    2 666 666 666 666
    3 6 25 50 20
    4 666 666 666 666
    5 29 14 50 68
    6 87 87 94 96
    7 666 666 666 666
    In [17]:
    df.replace(to_replace=[6,25],value=[666,2255])
    
    Out[17]:
     0123
    0 37 12 72 9
    1 75 5 79 64
    2 66 66 66 66
    3 666 2255 50 20
    4 66 66 66 66
    5 29 14 50 68
    6 87 87 94 96
    7 66 66 66 66
    In [18]:
    df.replace(to_replace={66:66666})
    
    Out[18]:
     0123
    0 37 12 72 9
    1 75 5 79 64
    2 66666 66666 66666 66666
    3 6 25 50 20
    4 66666 66666 66666 66666
    5 29 14 50 68
    6 87 87 94 96
    7 66666 66666 66666 66666
    In [20]:
    df.replace(to_replace={2:66},value=666)
    
    Out[20]:
     0123
    0 37 12 72 9
    1 75 5 79 64
    2 66 66 666 66
    3 6 25 50 20
    4 66 66 666 66
    5 29 14 50 68
    6 87 87 94 96
    7 66 66 666 66
     

    注意:DataFrame中,无法使用method和limit参数

    2) map()函数:新建一列 , map函数并不是df的方法,而是series的方法

    • map()可以映射新一列数据
    • map()中可以使用lambd表达式
    • map()中可以使用方法,可以是自定义的方法

      eg:map({to_replace:value})

    • 注意 map()中不能使用sum之类的函数,for循环
    • 新增一列:给df中,添加一列,该列的值为英文名对应的中文名
    In [ ]:
      name salary
    1 aa    1110
    
    In [21]:
    dic = {
        'name':['jay','tom','jay'],
        'salary':[10000,15000,10000]
    }
    df = DataFrame(data=dic)
    df
    
    Out[21]:
     namesalary
    0 jay 10000
    1 tom 15000
    2 jay 10000
    In [24]:
    #定制一个映射关系表
    dic = {
        'jay':'周杰伦',
        'tom':'张三'
    }
    df['c_name'] = df['name'].map(dic)
    df
    
    Out[24]:
     namesalaryc_name
    0 jay 10000 周杰伦
    1 tom 15000 张三
    2 jay 10000 周杰伦

    map当做一种运算工具,至于执行何种运算,是由map函数的参数决定的(参数:lambda,函数)

    • 使用自定义函数
    In [25]:
    def after_sal(s):
        if s < 10000:
            return s
        else:
            return s-(s-10000)*0.5
    
    In [27]:
    #超过10000部分的钱缴纳50%的税
    df['after_sal'] = df['salary'].map(after_sal)
    
    In [28]:
    df
    
    Out[28]:
     namesalaryc_nameafter_sal
    0 jay 10000 周杰伦 10000.0
    1 tom 15000 张三 12500.0
    2 jay 10000 周杰伦 10000.0
     
    • 使用lambda表达式

    注意:并不是任何形式的函数都可以作为map的参数。只有当一个函数具有一个参数且有返回值,那么该函数才可以作为map的参数。

    3. 使用聚合操作对数据异常值检测和过滤

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

    • 创建一个1000行3列的df 范围(0-1),求其每一列的标准差
    In [29]:
    df = DataFrame(data=np.random.random(size=(1000,3)),columns=['A','B','C'])
    df
    
    Out[29]:
     ABC
    0 0.313424 0.692323 0.876389
    1 0.894607 0.085044 0.039055
    2 0.169830 0.878143 0.098347
    3 0.421108 0.957890 0.533165
    4 0.691877 0.315516 0.686501
    5 0.834626 0.018288 0.750144
    6 0.988861 0.748166 0.280444
    7 0.789279 0.103226 0.447894
    8 0.908596 0.293614 0.287775
    9 0.130029 0.019367 0.678836
    10 0.211628 0.265547 0.491573
    11 0.053363 0.574118 0.146729
    12 0.589306 0.699758 0.102334
    13 0.414056 0.694400 0.414179
    14 0.049953 0.535896 0.663795
    15 0.514889 0.944595 0.586555
    16 0.903402 0.137475 0.139276
    17 0.807391 0.397677 0.165354
    18 0.927509 0.347766 0.750812
    19 0.725998 0.883306 0.623672
    20 0.750942 0.348898 0.269928
    21 0.895886 0.428091 0.964840
    22 0.663441 0.621696 0.114746
    23 0.949489 0.449912 0.578390
    24 0.408137 0.237027 0.903380
    25 0.573679 0.002870 0.617145
    26 0.326645 0.527058 0.885942
    27 0.357270 0.908535 0.623360
    28 0.015821 0.929437 0.690897
    29 0.997323 0.172341 0.137136
    ... ... ... ...
    970 0.709589 0.118778 0.082144
    971 0.906335 0.389239 0.533403
    972 0.963242 0.759054 0.325540
    973 0.085849 0.536024 0.336125
    974 0.021685 0.771152 0.384909
    975 0.571321 0.755743 0.940847
    976 0.612322 0.315396 0.110077
    977 0.073919 0.319691 0.660839
    978 0.695152 0.207718 0.082796
    979 0.305511 0.547575 0.754670
    980 0.529657 0.286984 0.624180
    981 0.264837 0.652693 0.841898
    982 0.638948 0.565631 0.307142
    983 0.876777 0.988822 0.777479
    984 0.573644 0.141279 0.314929
    985 0.366859 0.291895 0.445953
    986 0.610633 0.212915 0.249760
    987 0.112150 0.307589 0.497448
    988 0.489808 0.995577 0.981109
    989 0.436563 0.972021 0.214398
    990 0.541121 0.453435 0.967609
    991 0.836176 0.214147 0.439539
    992 0.168477 0.529087 0.793485
    993 0.035879 0.191359 0.977456
    994 0.960797 0.556592 0.646091
    995 0.272093 0.952091 0.669775
    996 0.666808 0.011103 0.852970
    997 0.778326 0.684924 0.740782
    998 0.156572 0.718775 0.096818
    999 0.706949 0.002632 0.776206

    1000 rows × 3 columns

    对df应用筛选条件,去除标准差太大的数据:假设过滤条件为 C列数据大于两倍的C列标准差

    In [35]:
    value_std = df['C'].std()*2
    df['C'] <= value_std
    df.loc[df['C'] <= value_std]
    
    Out[35]:
     ABC
    1 0.894607 0.085044 0.039055
    2 0.169830 0.878143 0.098347
    3 0.421108 0.957890 0.533165
    6 0.988861 0.748166 0.280444
    7 0.789279 0.103226 0.447894
    8 0.908596 0.293614 0.287775
    10 0.211628 0.265547 0.491573
    11 0.053363 0.574118 0.146729
    12 0.589306 0.699758 0.102334
    13 0.414056 0.694400 0.414179
    16 0.903402 0.137475 0.139276
    17 0.807391 0.397677 0.165354
    20 0.750942 0.348898 0.269928
    22 0.663441 0.621696 0.114746
    23 0.949489 0.449912 0.578390
    29 0.997323 0.172341 0.137136
    30 0.932595 0.696818 0.066000
    32 0.711525 0.124271 0.019880
    33 0.026211 0.028306 0.246211
    34 0.860028 0.538831 0.552822
    35 0.842031 0.124173 0.279184
    36 0.585759 0.969596 0.561030
    37 0.018647 0.800633 0.232974
    39 0.747122 0.556240 0.136455
    40 0.059918 0.121343 0.044552
    42 0.559717 0.012556 0.071974
    43 0.967276 0.568100 0.203293
    44 0.252326 0.743826 0.195429
    47 0.828981 0.156791 0.018576
    50 0.579745 0.380141 0.550948
    ... ... ... ...
    936 0.576960 0.251657 0.300172
    937 0.170987 0.189592 0.463421
    942 0.007340 0.573132 0.572431
    943 0.834380 0.384716 0.091041
    944 0.581687 0.024846 0.361796
    945 0.985317 0.868779 0.152497
    955 0.924510 0.479271 0.088230
    956 0.569654 0.244951 0.039578
    958 0.488209 0.317936 0.314025
    960 0.083895 0.108559 0.529256
    961 0.660142 0.694746 0.313222
    962 0.037778 0.414563 0.226044
    964 0.391152 0.300298 0.553752
    966 0.432107 0.690434 0.216025
    968 0.190050 0.296063 0.006210
    970 0.709589 0.118778 0.082144
    971 0.906335 0.389239 0.533403
    972 0.963242 0.759054 0.325540
    973 0.085849 0.536024 0.336125
    974 0.021685 0.771152 0.384909
    976 0.612322 0.315396 0.110077
    978 0.695152 0.207718 0.082796
    982 0.638948 0.565631 0.307142
    984 0.573644 0.141279 0.314929
    985 0.366859 0.291895 0.445953
    986 0.610633 0.212915 0.249760
    987 0.112150 0.307589 0.497448
    989 0.436563 0.972021 0.214398
    991 0.836176 0.214147 0.439539
    998 0.156572 0.718775 0.096818

    582 rows × 3 columns

    4. 排序

    使用.take()函数排序

    - take()函数接受一个索引列表,用数字表示,使得df根据列表中索引的顺序进行排序
    - eg:df.take([1,3,4,2,5])
    

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

    In [37]:
    df.head()
    
    Out[37]:
     ABC
    0 0.313424 0.692323 0.876389
    1 0.894607 0.085044 0.039055
    2 0.169830 0.878143 0.098347
    3 0.421108 0.957890 0.533165
    4 0.691877 0.315516 0.686501
    In [46]:
    random_df = df.take(np.random.permutation(1000),axis=0).take(np.random.permutation(3),axis=1)
    random_df[0:100]
    
    Out[46]:
     BAC
    793 0.075033 0.405557 0.861352
    705 0.279621 0.399755 0.423510
    18 0.347766 0.927509 0.750812
    633 0.703999 0.869911 0.470299
    992 0.529087 0.168477 0.793485
    562 0.326831 0.259218 0.249462
    335 0.823003 0.656202 0.951776
    806 0.099440 0.042630 0.223238
    428 0.645078 0.790637 0.393884
    961 0.694746 0.660142 0.313222
    82 0.410811 0.382103 0.401480
    635 0.906260 0.172077 0.807110
    282 0.991347 0.064740 0.052995
    393 0.956302 0.628240 0.589923
    210 0.106584 0.787552 0.985709
    114 0.636604 0.974740 0.993913
    743 0.368577 0.282428 0.292727
    850 0.950793 0.317945 0.207407
    728 0.217220 0.940828 0.497564
    701 0.900449 0.451362 0.871986
    214 0.759196 0.216617 0.722915
    80 0.698057 0.755082 0.864479
    684 0.772580 0.102757 0.137206
    779 0.905377 0.573561 0.347414
    61 0.604310 0.485991 0.549548
    9 0.019367 0.130029 0.678836
    792 0.481400 0.059529 0.925704
    190 0.221397 0.744473 0.214112
    770 0.146748 0.384114 0.696878
    523 0.287987 0.743749 0.314417
    ... ... ... ...
    839 0.542540 0.072265 0.882486
    211 0.572405 0.177161 0.044845
    733 0.731138 0.110557 0.545471
    686 0.517787 0.672421 0.190087
    749 0.268263 0.012523 0.796745
    127 0.465001 0.709387 0.947549
    788 0.931003 0.452559 0.278504
    212 0.189606 0.787116 0.527904
    237 0.700726 0.251639 0.540261
    290 0.469789 0.382467 0.979483
    911 0.086679 0.903379 0.193000
    53 0.752756 0.210174 0.066536
    438 0.536768 0.555900 0.390610
    846 0.129501 0.861011 0.575070
    300 0.726894 0.142221 0.477013
    466 0.312681 0.005797 0.055698
    584 0.847627 0.938719 0.659036
    364 0.589824 0.126736 0.036068
    679 0.039736 0.174501 0.147569
    755 0.084021 0.395750 0.829574
    610 0.845518 0.150690 0.820202
    547 0.942499 0.911763 0.613550
    843 0.273918 0.091754 0.105107
    532 0.650831 0.607442 0.846055
    204 0.056141 0.782182 0.835272
    559 0.257893 0.930644 0.934445
    63 0.173956 0.963263 0.126330
    248 0.564498 0.715946 0.794578
    629 0.151228 0.113966 0.052491
    200 0.643896 0.188745 0.754306

    100 rows × 3 columns

    • np.random.permutation(x)可以生成x个从0-(x-1)的随机数列
    In [41]:
    np.random.permutation(1000)
    
    Out[41]:
    array([4, 0, 3, 2, 1])

    随机抽样

    当DataFrame规模足够大时,直接使用np.random.permutation(x)函数,就配合take()函数实现随机抽样

    5. 数据分类处理【重点】

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

    数据分类处理:

    • 分组:先把数据分为几组
    • 用函数处理:为不同组的数据应用不同的函数以转换数据
    • 合并:把不同组得到的结果合并起来

    数据分类处理的核心:

     - groupby()函数
     - groups属性查看分组情况
     - eg: df.groupby(by='item').groups

    分组

    In [1]:
    from pandas import DataFrame,Series
    
    In [47]:
    df = DataFrame({'item':['Apple','Banana','Orange','Banana','Orange','Apple'],
                    'price':[4,3,3,2.5,4,2],
                   'color':['red','yellow','yellow','green','green','green'],
                   'weight':[12,20,50,30,20,44]})
    df
    
    Out[47]:
     itempricecolorweight
    0 Apple 4.0 red 12
    1 Banana 3.0 yellow 20
    2 Orange 3.0 yellow 50
    3 Banana 2.5 green 30
    4 Orange 4.0 green 20
    5 Apple 2.0 green 44
    • 使用groupby实现分组
    In [48]:
    df.groupby(by='item',axis=0)
    
    Out[48]:
    <pandas.core.groupby.groupby.DataFrameGroupBy object at 0x0000000007C86208>
    • 使用groups查看分组情况
    In [49]:
    #该函数可以进行数据的分组,但是不显示分组情况
    df.groupby(by='item',axis=0).groups
    
    Out[49]:
    {'Apple': Int64Index([0, 5], dtype='int64'),
     'Banana': Int64Index([1, 3], dtype='int64'),
     'Orange': Int64Index([2, 4], dtype='int64')}
    In [73]:
    #使用goups属性查看分组情况
    • 分组后的聚合操作:分组后的成员中可以被进行运算的值会进行运算,不能被运算的值不进行运算
    In [58]:
    #给df创建一个新列,内容为各个水果的平均价格
    df.groupby(by='item').mean()['price']
    
    Out[58]:
    item
    Apple     3.00
    Banana    2.75
    Orange    3.50
    Name: price, dtype: float64
    In [60]:
    mean_price = df.groupby(by='item')['price'].mean()
    
    In [64]:
    dic = mean_price.to_dict()
    df['mean_price'] = df['item'].map(dic)
    df
    
    Out[64]:
     itempricecolorweightmean_price
    0 Apple 4.0 red 12 3.00
    1 Banana 3.0 yellow 20 2.75
    2 Orange 3.0 yellow 50 3.50
    3 Banana 2.5 green 30 2.75
    4 Orange 4.0 green 20 3.50
    5 Apple 2.0 green 44 3.00

    计算出苹果的平均价格

    In [52]:
    df.groupby(by='item',axis=0).mean()['price'][0]
    
    Out[52]:
    3.0

    按颜色查看各种颜色的水果的平均价格

    In [68]:
    color_price = df.groupby(by='color')['price'].mean()
    
    In [70]:
    dic = color_price.to_dict()
    
    In [72]:
    df['color_mean_price'] = df['color'].map(dic)
    df
    
    Out[72]:
     itempricecolorweightmean_pricecolor_mean_price
    0 Apple 4.0 red 12 3.00 4.000000
    1 Banana 3.0 yellow 20 2.75 3.000000
    2 Orange 3.0 yellow 50 3.50 3.000000
    3 Banana 2.5 green 30 2.75 2.833333
    4 Orange 4.0 green 20 3.50 2.833333
    5 Apple 2.0 green 44 3.00 2.833333

    6.0 高级数据聚合

    使用groupby分组后,也可以使用transform和apply提供自定义函数实现更多的运算

    • df.groupby('item')['price'].sum() <==> df.groupby('item')['price'].apply(sum)
    • transform和apply都会进行运算,在transform或者apply中传入函数即可
    • transform和apply也可以传入一个lambda表达式
    In [8]:
    df.groupby(by='item')['price'].mean()
    
    Out[8]:
    item
    Apple     3.00
    Banana    2.75
    Orange    3.50
    Name: price, dtype: float64
    In [12]:
    #求出各种水果价格的平均值
    df.groupby(by='item')['price']
    
    Out[12]:
    <pandas.core.groupby.groupby.SeriesGroupBy object at 0x1148c30f0>
    In [27]:
    df
    
    Out[27]:
     itempricecolorweight
    0 Apple 4.0 red 12
    1 Banana 3.0 yellow 20
    2 Orange 3.0 yellow 50
    3 Banana 2.5 green 30
    4 Orange 4.0 green 20
    5 Apple 2.0 green 44
    In [74]:
    #使用apply函数求出水果的平均价格
    df.groupby(by='item')['price'].apply(fun)
    
    Out[74]:
    item
    Apple     3.00
    Banana    2.75
    Orange    3.50
    Name: price, dtype: float64
    In [73]:
    def fun(s):
        sum = 0
        for i in s:
            sum+=i
        return sum/s.size
    
    In [75]:
    #使用transform函数求出水果的平均价格
    df.groupby(by='item')['price'].transform(fun)
    
    Out[75]:
    0    3.00
    1    2.75
    2    3.50
    3    2.75
    4    3.50
    5    3.00
    Name: price, dtype: float64
  • 相关阅读:
    河南省第十二届大学生程序设计竞赛 F: Information Transmission-1(二分图最大匹配)
    hdu1068:Girls and Boys(最大独立集)
    hdu1068:Girls and Boys(最大独立集)
    hdu1281:棋盘游戏(二分图最大匹配)
    hdu1281:棋盘游戏(二分图最大匹配)
    洛谷P1991 :无线通讯网(最小生成树)
    洛谷P1991 :无线通讯网(最小生成树)
    oGitHub 注册
    Lambda应用设计模式 [转载]
    读取excel数据 到 datagrid 出现 找不到可安装的ISAM
  • 原文地址:https://www.cnblogs.com/bilx/p/11635911.html
Copyright © 2020-2023  润新知