[Python] 变量重分类(连续变量重分类、离散变量重分类)

本文介绍了如何使用Python进行连续变量和离散变量的重分类。对于连续变量,详细阐述了等宽和等频两种重编码方法,并给出了具体案例。离散变量的重分类则包括将分类信息映射到单一指标以及通过`pd.get_dummies()`创建多个指标。内容涵盖了从简单的数据处理到复杂的数据转换技巧。

目录

1. Python连续变量重分类

1.1 等宽重编码

1.2 等频重编码

2. 离散变量重分类

2.1 分类后为1个指标

2.2 分类后为多个指标

1. Python连续变量重分类

cut(  )函数

新变量 = pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)

# x:待分类的变量
# bins:分段的依据
# right:right=True表示分段后包含右边的数,即左开又闭(X,X]
# labels:分类后新的分类标签,若不修改默认以(X,X]/[X,X) 的格式显示
# 其他参数详见:help(pd.cut)

1.1 等宽重编码

案例 :

一份df格式的2020年的人口数据,数值为连续型,最小值为0,最大值为109695.39。现在需要分段为0,(0,100]、(100,300]、(300,500]、(500,700]、(700,900]、(900,1100]、(1100,1300]、1300及以上9类。

#格式左开右闭,从零开始(XX],bins需要加一个最大值
bins = [0,100,200,300,500,700,900,1100,1300,max(df['2020'])] #10个数,9个空格,产生9类
df['2020分层'] = pd.cut(df['2020'],bins,right=True)

#给重分类结果添加标签
bins = [0,100,200,300,500,700,900,1100,1300,max(Wpop2['2020'])]
df['2020分层'] = pd.cut(df['2020'],bins,right=True,labels=[1,2,3,4,5,6,7,8,9])

Python中,将连续变量转换为离散变量的方法主要包括**等宽分箱(Equal Width Binning)**、**频率分箱(Quantile Binning)**以及**二值化(Binarization)**。这些方法可以用于特征工程中的变量离散化处理,以适应某些仅接受离散输入的算法或优化数据分布。 ### 等宽分箱(Equal Width Binning) 等宽分箱是一种将连续变量划分为具有相同宽度的区间的方法。这种方法简单直观,适用于均匀分布的数据[^1]。可以通过 `pandas.cut()` 函数实现: ```python import pandas as pd data = pd.Series([0, 1, 6, 7, 2, 10, 8, 22, 5, 11, 10]) # 将数据分为三个等宽区间,并赋予标签 data_cut = pd.cut(data, bins=3, labels=['A', 'B', 'C']) print(data_cut) ``` ### 频率分箱(Quantile Binning) 频率分箱根据数据的分布情况将其划分为具有相等样本数量的区间。此方法特别适用于数据分布不均的情况。`pandas.qcut()` 是实现该功能的主要函数[^2]: ```python # 按照数据的分布划分成两个区间 data_qcut = pd.qcut(data, q=2, labels=['Low', 'High']) print(data_qcut) ``` 此外,也可以指定具体的分位数进行分箱: ```python # 按照特定的分位数进行划分 data_custom_qcut = pd.qcut(data, q=[0, 0.5, 1], labels=['1', '2']) print(data_custom_qcut) ``` ### 连续变量二值化(Binarization) 二值化是将连续变量转换为二元变量的一种方式,通常设定一个阈值,低于该阈值的变量被设为0,高于或等于该阈值的变量被设为1。`sklearn.preprocessing.Binarizer` 可以实现这一功能[^3]: ```python from sklearn.preprocessing import Binarizer import numpy as np data = np.array([[0], [1], [6], [7], [2], [10], [8], [22], [5], [11], [10]]) binarizer = Binarizer(threshold=5) binary_data = binarizer.transform(data) print(binary_data) ``` 上述代码将所有小于或等于5的值设置为0,大于5的值设置为1。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

禾木页

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

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

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

打赏作者

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

抵扣说明:

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

余额充值