pandas数据预处理之数据转换

文章介绍了在数据分析中如何使用pandas的cut和qcut函数对连续数据进行分箱离散化,以及使用get_dummies方法将类别型数据转化为哑变量。通过示例展示了处理过程,包括等宽分箱、哑变量编码以及数据合并。
摘要由CSDN通过智能技术生成

数据转换

数据分析和统计的预处理阶段,经常的会碰到年龄、消费等连续型数值,我们希望将数值进行离散化分段统计,提高数据区分度,那么会使用到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
'''
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上行舟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值