数据转换
数据分析和统计的预处理阶段,经常的会碰到年龄、消费等连续型数值,我们希望将数值进行离散化分段统计,提高数据区分度,那么会使用到pandas中的 cut() 方法
离散化连续数据
Python实现连续数据的离散化处理主要基于两个函数,pandas.cut和pandas.qcut,前者根据指定分界点对连续数据进行分箱处理,后者则可以根据指定箱子的数量对连续数据进行等宽分箱处理,所谓等宽指的是每个箱子中的数据量是相同的。
pandas.cut(x,bins,right = True,labels = None,retbins = False,precision = 3,include_lowest = False,duplicates =‘raise’ )
- x:表示要分箱的数组,必须是一维的。
- bins:接收int和序列类型的数据。
- right:是否包含右端点,决定区间的开闭,默认为True。
import pandas as pd
ages = [15,19,25,22,30,45,66,70,58]
bins = [12,25,45,50,100]
cuts = pd.cut(ages,bins)
print(cuts)
'''
[(12, 25], (12, 25], (12, 25], (12, 25], (25, 45], (25, 45], (50, 100], (50, 100], (50, 100]]
Categories (4, interval[int64]): [(12, 25] < (25, 45] < (45, 50] < (50, 100]]
'''
哑变量处理类别型数据
哑变量又称虚拟变量、名义变量,从名称上看就知道,它是人为虚设的变量,用来反映某个变量的不同类别。使用哑变量处理类别转换,事实上就是将分类变量转换为哑变量矩阵或指标矩阵,矩阵的值通常为"0"或"1"表示。
在Pandas中,可以使用get_dummies()函数对类别特征进行哑变量处理
pandas.get_dummies(data, prefix=None, prefix_sep=‘_’, dummy_na=False,columns=None, sparse=False, drop_first=False, dtype=None)
- data:表示哑变量处理的数据。
- prefix:表示列名的前缀,默认为None。
- prefix_sep:用于附加前缀作为分隔符使用,默认为“_”。
例:(1)使用 get_dummies() 对salary进行转换。
由于原始数据中有一条salary的值为‘nme’的数据,先将该条数据进行删除,在对salsry进行哑变量编码:
data = pd.read_csv('D:/data/HR.csv',encoding = 'gbk')
data = data[['number_project','left','salary']]
print(data.head(5))
'''
number_project left salary
0 2 1 low
1 5 1 medium
2 7 1 medium
3 5 1 low
4 2 1 low
'''
删掉salary为‘nme’那条记录
data = data[~data['salary'].isin(['nme'])]
print(data.tail())
'''
number_project left salary
14996 2 1 low
14997 6 1 low
14998 2 1 low
14999 2 1 low
15000 2 1 low
'''
print(pd.get_dummies(data['salary'])[:5])
'''
high low medium
0 0 1 0
1 0 0 1
2 0 0 1
3 0 1 0
4 0 1 0
'''
通过prefix设置前缀
dummies=pd.get_dummies(data['salary'],prefix = 'sala
dummies[:5]
salary_high salary_low salary_medium
0 0 1 0
1 0 0 1
2 0 0 1
3 0 1 0
4 0 1 0
(2)使用df.join()或pd.concat()将新的哑变量编码数据与原本未编码的数据进行合并
展示全部的列
pd.set_option('display.max_columns',None)
合并数据—df.join()
newdata = data[['number_project','left']].join(dummies)
print(newdata.head())
'''
number_project left salary_high salary_low salary_medium
0 2 1 0 1 0
1 5 1 0 0 1
2 7 1 0 0 1
3 5 1 0 1 0
4 2 1 0 1 0
'''
合并数据—pd.concat()
newdata1 = pd.concat([data[['number_project','left']],dummies],axis=1)
print(newdata1[:5])
'''
number_project left salary_high salary_low salary_medium
0 2 1 0 1 0
1 5 1 0 0 1
2 7 1 0 0 1
3 5 1 0 1 0
4 2 1 0 1 0
'''
(3)若需要对DataFrame中所有的元素均进行哑变量变化,则
pd.get_dummies(data)
(4)若仅需要对某几个特征进行编码,可以用columns进行指定要编码的特征;
pd.get_dummies(data,columns=['salary'])
(5)通过drop_first = True将第一个编码特征丢掉
print(pd.get_dummies(data,columns=['salary'],drop_first = True)[:5])
'''
number_project left salary_low salary_medium
0 2 1 1 0
1 5 1 0 1
2 7 1 0 1
3 5 1 1 0
4 2 1 1 0
'''