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聚类分析法
主要是通过聚类分析算法进行聚类,然后处理聚类得到的簇,为合并到一个簇的连续型数据做同一标记。