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

与世无争的帅哥 提交于 2019-11-30 18:55:50

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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!