机器学习测试笔记(6)——数据清洗和准备

2021-01-04 14:21:48 浏览数 (1)

代码语言:javascript复制
# coding:utf-8
import numpy asnp
import pandas aspd#C:Usersxiang>pip3install pandas

1 数据清洗和准备

1.1 数据概览和类型转换

代码语言:javascript复制
#1.1.1数据概览
def data_info():
    data = pd.read_csv('my.csv')
    print("data.info:n",data.info())
    print("data.shape:n",data.shape)#规模
    print("data.dtype:n",data.dtypes)#类型
    print("data.head:n",data.head())#前五行
    print("data.tail:n",data.tail())#后五行

输出:

代码语言:javascript复制
<class'pandas.core.frame.DataFrame'>
RangeIndex: 3entries, 0 to 2
Data columns(total 4 columns):
 #  Column  Non-Null Count  Dtype
---  ------ --------------  -----
 0   编号      3 non-null      int64
 1   姓名      3 non-null      object
 2   手机      3 non-null      int64
 3  Email      3 non-null      object
dtypes:int64(2), object(2)
memory usage:224.0  bytes
data.info:
 None
data.shape:
 (3, 4)
data.dtype:
 编号        int64
姓名         object
手机         int64
Email        object
dtype:       object
data.head:
    编号   姓名  手机              Email
0   1      张三  13686544556      zhangsan@126.com
1   2      李四  13554346655      lisi@126.com
2   3      王五  18954357788      wangwu@126.com
data.tail:
    编号    姓名  手机              Email
0   1      张三   13686544556      zhangsan@126.com
1   2      李四   13554346655      lisi@126.com
2   3      王五   18954357788      wangwu@126.com
代码语言:javascript复制
#1.1.2数据类型转换
defchange_type():
data = pd.read_csv('user.csv')
data['编号'] = data['编号'].astype(str)
data['价格'] = data['价格'].str[1:].astype(float)
data['生日'] = pd.to_datetime(data['生日'],format='%Y-%m-%d')
    print("data.dtype:n",data.dtypes)

输出:

代码语言:javascript复制
data.dtype:
编号                object
姓名                object
手机                int64
Email               object
生日                datetime64[ns]
价格                float64
dtype:              object

1.2 处理丢失数据

代码语言:javascript复制
# 1.2.1 判断是否为空
def judge_is_null():
    data = pd.read_csv('my2.csv')
    print("data is:n",data)
    print("data is nulln",data.isnull())
    print("去除缺省值的数据行n",data.dropna())
    print("去除缺省值的数据列n",data.dropna(axis=1))

输出:

代码语言:javascript复制
data is:
    编号   姓名     手机             Email
0   1      张三     13686544556     zhangsan@126.com
1   2      李四     13554346655     NaN
2   3      王五     18954357788     wangwu@126.com
data is null
      编号  姓名   手机    Email
0     False False  False  False
1     False False  False  True
2     False False  False  False
去除缺省值的数据行
    编号  姓名   手机            Email
0   1     张三   13686544556    zhangsan@126.com
2   3     王五   18954357788    wangwu@126.com
去除缺省值的数据列
    编号  姓名   手机            Email
0   1     张三   13686544556
1   2     李四   13554346655
2   3     王五   18954357788 
代码语言:javascript复制
# 1.2.2 填充丢失数据
def replace_null():
    data = pd.read_csv('my2.csv')
     print("用0填充n",data.fillna(0))
     print("用字典填充n",data.fillna({"姓名":"--","手机":"未知","Email":"---"}))

输出:

代码语言:javascript复制
用0填充
    编号      姓名    手机            Email
0   1         张三    13686544556     zhangsan@126.com
1   2         李四    13554346655     0
2   3         王五     18954357788    wangwu@126.com
用字典填充
   编号       姓名        手机               Email
0  1          张三        13686544556       zhangsan@126.com
1  2          李四        13554346655        ---
2  3          王五        18954357788       wangwu@126.com

1.3 处理重复数据

代码语言:javascript复制
# 1.3.1 是否重复
def is_duplicate():
    data =pd.DataFrame({"A":['a','b']*3 ['a','b'],"B":[1,1,2,2,3,3,2,3]})
    print("data is:n",data)
    print("数据是否有重复:n",data.duplicated())
    print("A列数据是否有重复:n",data.duplicated(['A']))

输出:

代码语言:javascript复制
data is:
   A  B
0  a  1
1  b  1
2  a  2
3  b  2
4  a  3
5  b  3
6  a  2
7  b  3
数据是否有重复:
0    False
1    False
2    False
3    False
4    False
5    False
6     True
7     True
dtype: bool
A列数据是否有重复:
0    False
1    False
2     True
3     True
4     True
5     True
6     True
7     True
dtype: bool
代码语言:javascript复制
# 1.3.2 丢弃重复数据
def  drop_duplicate():
     data =  pd.DataFrame({"A":['a','b']*3 ['a','b'],"B":[1,1,2,2,3,3,2,3]})
    print("删除重复行:n",data.drop_duplicates())
     print("删除A列的重复数据:n",data.drop_duplicates(['A']))

输出:

代码语言:javascript复制
删除重复行:
   A  B
0  a  1
1  b  1
2  a  2
3  b  2
4  a  3
5  b  3
删除A列的重复数据:
   A  B
0  a  1
1  b  1

1.4 数据转换

代码语言:javascript复制
def  data_type_transfer():
    data = pd.read_csv('user1.csv')
    data['姓名'] = data['姓名'].str.lower() #姓名转为小写
    data['生日'] = pd.to_datetime(data['生日'],format='%Y-%m-%d')
    city_to_Province ={
'上海':'上海',
'北京':'北京',
'南京':'江苏',
'银川':'宁夏',
'苏州':'江苏',
'无锡':'江苏'
    }
    data['省'] = data['城市'].map(city_to_Province)
    print("Data is:n",data)

输出:

代码语言:javascript复制
Data is:
    编号   姓名      手机                 生日           城市     省
0   1       jerry      136865445561972-08-23  上海      上海
1   2      tom        13554346655 1965-06-24  南京       江苏
2   3      cindy      189543577881987-04-23  银川      宁夏
3   4      peter      180675432331992-04-23  北京      北京
4   5      jessca     139876545671957-04-23  南京      江苏
5   6      john       13899773438 1962-04-23  苏州       江苏
6   7      black      189009876541973-04-23  无锡      江苏
7   8      white      188112211111983-04-23  苏州       江苏

1.5 数据替换

代码语言:javascript复制
def data_replace():
   data = pd.Series([1,2,3,4,7,888,9999])
   print("Data is:n",data)
   print("Replace 9999 to -1n",data.replace(9999,-1))
   print("Replace 9999 and 888n",data.replace([9999,888],[-1,0]))

输出:

代码语言:javascript复制
Data is:
0       1
1       2
2       3
3       4
4       7
5       888
6       9999
dtype: int64
Replace 9999 to-1
  0      1
1      2
2      3
3      4
4      7
5      888
6      -1
dtype: int64
Replace 9999 and 888
0    1
1    2
2    3
3    4
4    7
5    0
6   -1
dtype: int64

1.6 数据离散化,数据拆分

代码语言:javascript复制
def data_categories():
   scores = [54,63,76,83,93]
   grade = [0,60,70,80,90,100]
   data = pd.cut(scores,grade)
   print("data is:n",data)
   print("data.categories is:n",data.categories)
   print("data.codes is:n",data.codes)
   print("value counts:n",pd.value_counts(data))
   print("User Lables:n",pd.cut(scores,grade,labels=['E','D','C','B','A']))

输出:

代码语言:javascript复制
data is:
[(0, 60], (60,70], (70, 80], (80, 90], (90, 100]]
Categories (5,interval[int64]): [(0, 60] < (60, 70] < (70, 80] < (80, 90] < (90,100]]
data.categoriesis:
IntervalIndex([(0, 60], (60, 70], (70, 80],(80, 90], (90, 100]],
              closed='right',
              dtype='interval[int64]')
data.codes is:
[0 1 2 3 4]
value counts:
(90, 100]    1
(80, 90]     1
(70, 80]     1
(60, 70]     1
(0, 60]      1
dtype: int64
User Lables:
['E', 'D', 'C','B', 'A']
Categories (5,object): ['E' < 'D' < 'C' < 'B' < 'A']

1.7 过滤异常值

代码语言:javascript复制
def data_filter():
   data =  pd.DataFrame(np.random.rand(1000,3))
   data = round(data*100)
   print("data info:n",data.describe())
   print("data[1]>60:n",data[1][data[1]>60])#第一列大于60
   print("any data>60:n",data[(data>60).any(1)])#任意一列大于60

输出:

代码语言:javascript复制
data info:
                0    1            2
count    1000.000000 1000.000000  1000.000000
mean     49.901000    49.376000   50.897000
std      29.140906    29.287102   29.123918
min       0.000000     0.000000   0.000000
25%      24.000000    25.000000   25.000000
50%      49.500000    47.000000   52.000000
75%      75.000000    76.000000   77.000000
max     100.000000    100.000000   100.000000
data[1]>60:
1      87.0
7      89.0
9      76.0
10     94.0
11     74.0
       ...
991    90.0
993    80.0
996    76.0
997    61.0
999    88.0
Name: 1, Length:386, dtype: float64
any data>60:
        0 1     2
0    74.0 32.0  61.0
1     8.0 87.0  38.0
2    65.0  9.0   3.0
3    21.0 35.0  61.0
4    46.0 10.0  97.0
..    ...  ...   ...
994  85.0  7.0  64.0
996  86.0 76.0  60.0
997  51.0 61.0  96.0
998  85.0 38.0  30.0
999  27.0 88.0  75.0
[788 rows x 3columns]

1.8 字符串处理

1.8.1普通处理法

代码语言:javascript复制
def str_deal():
   text = '1,2,3,4,5,  6'
   splittext = text.split(',')
   striptext = [x.strip()  for x in splittext]
   print("split:n",splittext)
   print("strip:n",striptext)
   print("join:n"," ".join(striptext))
   print("find:n",text.find('3'))
   print("replace:n",text.replace('6','0'))

输出:

代码语言:javascript复制
split:
 ['1', '2', '3', '4', '5', '  6']
strip:
 ['1', '2', '3', '4', '5', '6']
join:
 1 2 3 4 5 6
find:
 4
replace:
 1,2,3,4,5, 0

1.8.2正则表达式处理(略)

2 数据规整

2.1层次化索引

代码语言:javascript复制
def data_index():
   data = pd.Series(np.random.rand(6),
   index=[
               ['江苏','江苏','浙江','浙江','广东','广东'],
               ['南京','苏州','杭州','宁波','广州','深圳']
           ])
   print("data is:n",data)
   print("data index is:n",data.index)
   print("data['江苏']:n",data['江苏'])
   print("data.loc[:,'深圳']:n",data.loc[:,'深圳'])
   print("data.unstack()n",data.unstack())
   print("data.unstack().stack()n",data.unstack().stack())

输出:

代码语言:javascript复制
data is:

江苏      南京    79.0
          苏州    7.0
浙江      杭州    21.0
          宁波    14.0
广东      广州    40.0
          深圳    30.0
dtype: float64
data index is:
MultiIndex([('江苏', '南京'),
            ('江苏', '苏州'),
            ('浙江', '杭州'),
            ('浙江', '宁波'),
            ('广东', '广州'),
            ('广东', '深圳')],
           )
data['江苏']:
南京   79.0
苏州   7.0
dtype: float64
data.loc[:,'深圳']:
广东    30.0
dtype: float64
data.unstack()
       南京   宁波    广州    杭州   深圳  苏州
广东   NaN    NaN     40.0    NaN   30.0  NaN
江苏   79.0   NaN     NaN     NaN   NaN   7.0
浙江   NaN    14.0    NaN     21.0  NaN   NaN
data.unstack().stack()
广东      广州    40.0
          深圳   30.0
江苏      南京   79.0
          苏州   7.0
浙江      宁波   14.0
          杭州   21.0
dtype: float64

2.2 合并数据集

代码语言:javascript复制
#2.2.1按指定列合并
def merge_data():
   df1 =  pd.DataFrame({'id':[1,2,3,4],'val':['Jerry','Tom','Kerry','Jessca']})
   df2 =  pd.DataFrame({'id':[1,2,3,4,5],'val':['Kerry','Peter','Jerry','Tom','Jessca']})
   print("df1 is:n",df1)
   print("df2 is:n",df2)
   print("merage:n",pd.merge(df1,df2,on='id'))
   df1 =  pd.DataFrame({'id1':[1,2,3,4],'val':['Jerry','Tom','Kerry','Jessca']})
   df2 =  pd.DataFrame({'id2':[1,2,3,4,5],'val':['Kerry','Peter','Jerry','Tom','Jessca']})
   print("merage:n",pd.merge(df1,df2,left_on='id1',right_on='id2'))
   print("merage:n",pd.merge(df1,df2,left_on='id1',right_on='id2',how='outer'))

输出:

代码语言:javascript复制
df1 is:
    id val
0   1  Jerry
1   2  Tom
2   3  Kerry
3   4 Jessca
df2 is:
    id val
0   1  Kerry
1   2  Peter
2   3  Jerry
3   4  Tom
4   5 Jessca
merage:
    id  val_x  val_y
0   1   Jerry  Kerry
1   2   Tom    Peter
2   3   Kerry  Jerry
3   4   Jessca Tom
merage:
    id1  val_x  id2  val_y
0    1   Jerry  1    Kerry
1    2   Tom    2    Peter
2    3   Kerry  3    Jerry
3    4   Jessca 4    Tom
merage:
    id1  val_x   id2   val_y
0  1.0  Jerry    1   Kerry
1  2.0  Tom      2   Peter
2  3.0  Kerry    3   Jerry
3  4.0  Jessca   4   Tom
4  NaN  NaN      5  Jessca
代码语言:javascript复制
#2.2.2合并数组
def  join_data():
    df1 = pd.DataFrame([['苏州','南京'],['广州','深圳'],['宁波','杭州']],
                       index =['江苏','广东','浙江'],
                       columns=['城市1','城市2'])                      
    df2 = pd.DataFrame([['赣州','南昌'],['成都','泸州'],['宁波','杭州']],
                       index =['江西','四川','浙江'],
                       columns=['城市3','城市4'])
    print("df1 is:n",df1)
    print("df2 is:n",df2)
    print("join:n",df1.join(df2))
    print("outer join:n",df1.join(df2,how='outer'))

输出:

代码语言:javascript复制
df1 is:

        城市1 城市2
江苏     苏州  南京
广东     广州  深圳
浙江     宁波  杭州
df2 is:
        城市3 城市4
江西     赣州  南昌
四川     成都  泸州
浙江     宁波  杭州
join:
      城市1  城市2   城市3     城市4
江苏  苏州   南京    NaN       NaN
广东  广州   深圳    NaN       NaN
浙江  宁波   杭州    宁波      杭州
outer join:
      城市1  城市2    城市3  城市4
四川  NaN   NaN      成都    泸州
广东   广州  深圳     NaN    NaN
江苏   苏州  南京     NaN    NaN
江西   NaN  NaN      赣州    南昌
浙江   宁波  杭州     宁波   杭州
代码语言:javascript复制
#2.2.3 合并序列
def concat_data():
   s1 = pd.Series([1,2],index=['苏州','南京'])
   s2 = pd.Series([3,4],index=['广州','深圳'])
   s3 = pd.Series([5,6],index=['宁波','杭州'])
   print("concat:n",pd.concat([s1,s2,s3]))
   print("concat use key:n",pd.concat([s1,s2,s3],keys=['江苏','广东','浙江']))
   df1 = pd.DataFrame([['苏州','南京'],['广州','深圳'],['宁波','杭州']],
   index =['江苏','广东','浙江'],columns=['城市1','城市2'])                      
   df2 = pd.DataFrame([['赣州','南昌'],['成都','泸州'],['宁波','杭州']],
   index =['江西','四川','浙江'],columns=['城市1','城市2'])
   print("concat Dataframe:n",pd.concat([df1,df2],axis=0,keys=['数据1','数据2']))
   print("concat Dataframe:n",pd.concat([df1,df2],axis=1,keys=['数据1','数据2']))

输出:

代码语言:javascript复制
concat:

苏州    1
南京    2
广州    3
深圳    4
宁波    5
杭州    6
dtype: int64
concat use key:
江苏  苏州   1
      南京    2
广东  广州   3
      深圳    4
浙江  宁波   5
      杭州    6
dtype: int64
concatDataframe:
        城市1 城市2
数据1 江苏  苏州  南京
      广东  广州 深圳
      浙江  宁波 杭州
数据2 江西  赣州  南昌
      四川  成都 泸州
      浙江  宁波 杭州
concatDataframe:
       数据1         数据2    
       城市1  城市2 城市1  城市2
江苏   苏州  南京  NaN    NaN
广东   广州  深圳  NaN    NaN
浙江   宁波  杭州  宁波   杭州
江西   NaN    NaN  赣州   南昌
四川   NaN    NaN  成都   泸州

2.3重塑和轴向旋转

代码语言:javascript复制
#2.3.1 轴向旋转
def pivot_data():
  df = pd.DataFrame([{"编号":"1","姓名":"Jerry","科目":"语文","成绩":"92"},
                  {"编号":"1","姓名":"Jerry","科目":"数学","成绩":"97"},
                  {"编号":"2","姓名":"Tom","科目":"语文","成绩":"100"},
                  {"编号":"2","姓名":"Tom","科目":"数学","成绩":"91"}])
  print("df is:n",df)
  print("df stack is:n",df.stack())
  print("df unstack is:n",df.unstack())
  print("df pivot is:n",df.pivot('编号','科目','成绩'))
  print("set_index and unstack  is:n",df.set_index(['编号','科目']).unstack())

输出:

代码语言:javascript复制
df is:
   编号     姓名  科目  成绩
0  1       Jerry  语文  92
1  1       Jerry  数学  97
2  2       Tom    语文 100
3  2       Tom    数学  91
df stack is:
0  编号       1
   姓名       Jerry
   科目       语文
   成绩       92
1  编号       1
   姓名       Jerry
   科目       数学
   成绩       97
2  编号       2
   姓名       Tom
   科目       语文
   成绩      100
3  编号       2
   姓名       Tom
   科目       数学
   成绩       91
dtype: object
df unstack is:
编号0       1
    1       1
    2       2
    3       2
姓名0    Jerry
    1    Jerry
    2    Tom
    3    Tom
科目0      语文
    1      数学
    2      语文
    3      数学
成绩0      92
    1      97
    2      100
    3      91
dtype: object
df pivot is:
科目  数学  语文
编号        
1     97    92
2     91    100
set_index andunstack is:
        姓名         成绩    
科目     数学   语文  数学  语文
编号                      
1       Jerry  Jerry  97   92
2       Tom    Tom    91  100
代码语言:javascript复制
#2.3.2 重塑
def  melt_data():
   df = pd.DataFrame({'属性':['编号','年龄','手机'],
 '张三':['1',54,'13681766555'],
 '李四':['2',32,'13966564433'],
 '王五':['3',48,'18977665643']
                     })
   print("df is:n",df)
   melt_res = pd.melt(df,['属性'])
   print("melt:n",melt_res)
   print("pivot:n",melt_res.pivot('属性','variable','value'))

输出:

代码语言:javascript复制
df is:
    属性  张三            李四           王五
0    1                   2             3
1   年龄  54             32            48
2   手机  13681766555    13966564433   18977665643
melt:
   属性       variable          value
0  编号       张三              1
1  年龄       张三              54
2  手机       张三              13681766555
3  编号       李四              2
4  年龄       李四              32
5  手机       李四              13966564433
6  编号       王五              3
7  年龄       王五              48
8  手机       王五              18977665643
pivot:
variable      张三           李四           王五
属性                                            
年龄        54           32           48
手机        13681766555  13966564433 18977665643
编号        1            2            3
代码语言:javascript复制
if  __name__=="__main__":
    data_info()
    change_type()
    judge_is_null()
    replace_null()
    is_duplicate()
    drop_duplicate()
    data_type_transfer()
    data_replace()
    data_categories()
    data_filter()
    str_deal()
    data_index()
    merge_data()
    join_data()
    concat_data()
    pivot_data()
     melt_data()

—————————————————————————————————

顾老师课程欢迎报名

软件安全测试

https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486

接口自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486

DevOps 和Jenkins之DevOps

https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486

DevOps与Jenkins 2.0之Jenkins

https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486

Selenium自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486

性能测试第1季:性能测试基础知识

https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486

性能测试第2季:LoadRunner12使用

https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486

性能测试第3季:JMeter工具使用

https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486

性能测试第4季:监控与调优

https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486

Django入门

https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486

啄木鸟顾老师漫谈软件测试

https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486

0 人点赞