1.数据转换
1.1数据值替换
数据替换不仅可以对一个值进行替换,也可以同时对不同值进行多值替换,参数传入的方式可以是列表,也可以是字典格式。Pandas中通过replace进行数据值的替换。
data = {'姓名':['李红','小明','马芳','国志'],'性别':['0','1','0','1'], '籍贯':['北京','甘肃','','上海']} df = pd.DataFrame(data) df = df.replace('','不详') print(df) #传入列表实现多值替换 df = df.replace(['不详','甘肃'],['兰州','兰州']) print(df) #传入字典实现多值替换 df = df.replace({'1':'男','0':'女'}) print(df) #------------------------------------------------------------------- 姓名 性别 籍贯 0 李红 0 北京 1 小明 1 甘肃 2 马芳 0 不详 3 国志 1 上海 姓名 性别 籍贯 0 李红 0 北京 1 小明 1 兰州 2 马芳 0 兰州 3 国志 1 上海 姓名 性别 籍贯 0 李红 女 北京 1 小明 男 兰州 2 马芳 女 兰州 3 国志 男 上海
1.2使用函数或映射进行数据转换
data = {'姓名':['李红','小明','马芳','国志'],'性别':['0','1','0','1'], '籍贯':['北京','兰州','兰州','上海']} df = pd.DataFrame(data) df['成绩'] = [58,86,91,78] print(df) def grade(x): if x>=90: return '优' elif 70<=x<90: return '良' elif 60<=x<70: return '中' else: return '差' df['等级'] = df['成绩'].map(grade) print(df) #---------------------------------------------------- 姓名 性别 籍贯 成绩 0 李红 0 北京 58 1 小明 1 兰州 86 2 马芳 0 兰州 91 3 国志 1 上海 78 姓名 性别 籍贯 成绩 等级 0 李红 0 北京 58 差 1 小明 1 兰州 86 良 2 马芳 0 兰州 91 优 3 国志 1 上海 78 良
2.数据标准化
2.1离差标准化数据
离差标准化是将原始数据的数值映射到[0,1]。转换公式如下:
def MinMaxScale(data): data = (data-data.min())/(data.max()-data.min()) return data x = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]]) print('原始数据为:\n',x) x_scaled = MinMaxScale(x) print('标准化后矩阵为:\n',x_scaled,end = '\n') #-------------------------------------------------------------- 原始数据为: [[ 1. -1. 2.] [ 2. 0. 0.] [ 0. 1. -1.]] 标准化后矩阵为: [[0.66666667 0. 1. ] [1. 0.33333333 0.33333333] [0.33333333 0.66666667 0. ]]
2.2标准差标准化数据
标准差标准化又称零均值标准化或z分数标准化,经过该方法处理的数据均值为0,标准差为1,转换公式如下:
def StandardScale(data): data = (data-data.mean())/data.std() return data x = np.array([[ 1., -1., 2.],[ 2., 0., 0.],[ 0., 1., -1.]]) print('原始数据为:\n',x) x_scaled = StandardScale(x) print('标准化后矩阵为:\n',x_scaled,end='\n') #------------------------------------------------------------------ 原始数据为: [[ 1. -1. 2.] [ 2. 0. 0.] [ 0. 1. -1.]] 标准化后矩阵为: [[ 0.52128604 -1.35534369 1.4596009 ] [ 1.4596009 -0.41702883 -0.41702883] [-0.41702883 0.52128604 -1.35534369]]
3.数据离散化
3.1等宽法
Pandas提供了cut函数,可以进行连续型数据的等宽离散化。
np.random.seed(666) score_list = np.random.randint(25, 100, size = 10) print('原始数据:\n',score_list) bins = [0, 59, 70, 80, 100] score_cut = pd.cut(score_list, bins) print(pd.value_counts(score_cut))# 统计每个区间人数 #---------------------------------------------------- 原始数据: [27 70 55 87 95 98 55 61 86 76] (80, 100] 4 (0, 59] 3 (59, 70] 2 (70, 80] 1
3.2等频法
相比于等宽法,等频法避免了类分布不均匀的问题,但是也有可能将数值非常相近的两个值分到不同的区间。
3.3聚类分析法
主要是通过聚类分析算法进行聚类,然后处理聚类得到的簇,为合并到一个簇的连续型数据做同一标记。