顾老师新书《全栈软件测试工程师宝典》
https://item.m.jd.com/product/10023427978355.html
以前两本书的网上购买地址:
《软件测试技术实战设计、工具及管理》:
https://item.jd.com/34295655089.html
《基于Django的电子商务网站》:
https://item.jd.com/12082665.html
# coding:utf-8 import numpy asnp import pandas aspd#C:\Users\xiang>pip3install pandas
1 数据清洗和准备
1.1 数据概览和类型转换
#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())#后五行
输出:
<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
#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)
输出:
data.dtype: 编号 object 姓名 object 手机 int64 Email object 生日 datetime64[ns] 价格 float64 dtype: object
1.2 处理丢失数据
# 1.2.1 判断是否为空 def judge_is_null(): data = pd.read_csv('my2.csv') print("data is:\n",data) print("data is null\n",data.isnull()) print("去除缺省值的数据行\n",data.dropna()) print("去除缺省值的数据列\n",data.dropna(axis=1))
输出:
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
# 1.2.2 填充丢失数据 def replace_null(): data = pd.read_csv('my2.csv') print("用0填充\n",data.fillna(0)) print("用字典填充\n",data.fillna({"姓名":"--","手机":"未知","Email":"---"}))
输出:
用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 处理重复数据
# 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']))
输出:
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
# 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']))
输出:
删除重复行: 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 数据转换
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)
输出:
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 数据替换
def data_replace(): data = pd.Series([1,2,3,4,7,888,9999]) print("Data is:\n",data) print("Replace 9999 to -1\n",data.replace(9999,-1)) print("Replace 9999 and 888\n",data.replace([9999,888],[-1,0]))
输出:
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 数据离散化,数据拆分
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']))
输出:
(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 过滤异常值
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
输出:
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普通处理法
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'))
输出:
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正则表达式处理(略)