浅谈pandas.cut与pandas.qcut的使用方法及区别


Posted in Python onMarch 03, 2020

pandas.cut:

pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)

参数:

1. x,类array对象,且必须为一维,待切割的原形式

2. bins, 整数、序列尺度、或间隔索引。如果bins是一个整数,它定义了x宽度范围内的等宽面元数量,但是在这种情况下,x的范围在每个边上被延长1%,以保证包括x的最小值或最大值。如果bin是序列,它定义了允许非均匀bin宽度的bin边缘。在这种情况下没有x的范围的扩展。

3. right,布尔值。是否是左开右闭区间

4. labels,用作结果箱的标签。必须与结果箱相同长度。如果FALSE,只返回整数指标面元。

5. retbins,布尔值。是否返回面元

6. precision,整数。返回面元的小数点几位

7. include_lowest,布尔值。第一个区间的左端点是否包含

返回值:

若labels为False则返回整数填充的Categorical或数组或Series

若retbins为True还返回用浮点数填充的N维数组

demo:

>>> pd.cut(np.array([.2, 1.4, 2.5, 6.2, 9.7, 2.1]), 3, retbins=True)
... 
([(0.19, 3.367], (0.19, 3.367], (0.19, 3.367], (3.367, 6.533], ...
Categories (3, interval[float64]): [(0.19, 3.367] < (3.367, 6.533] ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> pd.cut(np.array([.2, 1.4, 2.5, 6.2, 9.7, 2.1]),
... 3, labels=["good", "medium", "bad"])
... 
[good, good, good, medium, bad, good]
Categories (3, object): [good < medium < bad] 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> pd.cut(np.ones(5), 4, labels=False)
array([1, 1, 1, 1, 1])

pandas.qcut

pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise')

参数:

1.x
2.q,整数或分位数组成的数组。
3.labels,
4.retbins
5.precisoon
6.duplicates

结果中超过边界的值将会变成NA

demo:

>>> pd.qcut(range(5), 4)
... 
[(-0.001, 1.0], (-0.001, 1.0], (1.0, 2.0], (2.0, 3.0], (3.0, 4.0]]
Categories (4, interval[float64]): [(-0.001, 1.0] < (1.0, 2.0] ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> pd.qcut(range(5), 3, labels=["good", "medium", "bad"])
... 
[good, good, medium, bad, bad]
Categories (3, object): [good < medium < bad]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pd.qcut(range(5), 4, labels=False)
array([0, 0, 1, 2, 3])

补充拓展:解决 Python 中 qcut() 运行报错: Bin edges must be unique和drop duplicate edges by setting 'duplicates' kwarg

本次纠错背景,来源于互金领域信用风控建模中的变量分箱处理。(附在文末)

解决 Python 中 qcut() 函数运行报错:
Bin edges must be unique和 You can drop duplicate edges by setting the ‘duplicates' kwarg

首先,报错如下:

浅谈pandas.cut与pandas.qcut的使用方法及区别

然后,在qcut() 函数中设置duplicates参数为“drop”(不能设置为“raise”),解决(如下)。

浅谈pandas.cut与pandas.qcut的使用方法及区别

本次纠错背景,来源于互金领域信用风控建模中的变量分箱处理。如下:

# 五、变量选择
# 特征变量选择(排序)对于数据分析、机器学习从业者来说非常重要。
# 好的特征选择能够提升模型的性能,更能帮助我们理解数据的特点、底层结构,这对进一步改善模型、算法都有着重要作用。
# 至于Python的变量选择代码实现可以参考结合Scikit-learn介绍几种常用的特征选择方法。

# 在本文中,我们采用信用评分模型的变量选择方法,通过WOE分析方法,即是通过比较指标分箱和对应分箱的违约概率来确定指标是否符合经济意义。
# 首先我们对变量进行离散化(分箱)处理。
# 5.1 分箱处理
# 变量分箱(binning)是对连续变量离散化(discretization)的一种称呼。
# 信用评分卡开发中一般有常用的等距分段、等深分段、最优分段。
# 其中等距分段(Equval length intervals)是指分段的区间是一致的,比如年龄以十年作为一个分段;
# 等深分段(Equal frequency intervals)是先确定分段数量,然后令每个分段中数据数量大致相等;
# 最优分段(Optimal Binning)又叫监督离散化(supervised discretizaion),使用递归划分(Recursive Partitioning)将连续变量分为分段,背后是一种基于条件推断查找较佳分组的算法。

# 我们首先选择对连续变量进行最优分段,在连续变量的分布不满足最优分段的要求时,再考虑对连续变量进行等距分段。最优分箱的代码如下:

# 定义自动分箱函数

from scipy import stats
def mono_bin(Y, X, n = 20):
 r = 0
 good=Y.sum()
 bad=Y.count()-good
 while np.abs(r) < 1:
 d1 = pd.DataFrame({"X": X, "Y": Y, "Bucket": pd.qcut(X, n,duplicates="drop")}) 
 # 后面报错You can drop duplicate edges by setting the 'duplicates' kwarg,所以回到这里补充duplicates参数
 # pandas中使用qcut(),边界易出现重复值,如果为了删除重复值设置 duplicates=‘drop',则易出现于分片个数少于指定个数的问题
 d2 = d1.groupby('Bucket', as_index = True)
 r, p = stats.spearmanr(d2.mean().X, d2.mean().Y)
 n = n - 1
 d3 = pd.DataFrame(d2.X.min(), columns = ['min'])
 d3['min']=d2.min().X
 d3['max'] = d2.max().X
 d3['sum'] = d2.sum().Y
 d3['total'] = d2.count().Y
 d3['rate'] = d2.mean().Y
 d3['woe']=np.log((d3['rate']/(1-d3['rate']))/(good/bad))
 d4 = (d3.sort_index(by = 'min')).reset_index(drop=True)
 print("=" * 60)
 print(d4)
 return d4

# 此定义函数暂未理解通透,暂且保留。这里先直接使用。
# 原帖代码没有导入scipy.stats模块,会导致下一条语句运行报错,上面补上,搞定。
# 原帖代码qcut()函数中没有设置duplicates参数,上面补上,搞定。
# 自定义函数分箱RevolvingUtilizationOfUnsecuredLines时报错You can drop duplicate edges by setting the 'duplicates' kwarg
# 所以先回来删除重复值。删除后发现没有解决问题,真正解决问题是在qcut()函数中没有设置duplicates参数为“drop”(不能设置为“raise”)
data=data.drop_duplicates(subset=None,keep='first',inplace=False)
data.shape

(119703, 11)

# 针对我们将使用最优分段对于数据集中的RevolvingUtilizationOfUnsecuredLines、age、DebtRatio和MonthlyIncome进行分类。

mono_bin(data.SeriousDlqin2yrs,data.RevolvingUtilizationOfUnsecuredLines)

============================================================
 min  max sum total rate woe
0 0.000000 0.035034 29333 29926 0.980184 1.298275
1 0.035037 0.176771 29205 29926 0.975907 1.098457
2 0.176777 0.577036 28305 29925 0.945865 0.257613
3 0.577040 50708.000000 24607 29926 0.822262 -1.071254
min max sum total rate woe
0 0.000000 0.035034 29333 29926 0.980184 1.298275
1 0.035037 0.176771 29205 29926 0.975907 1.098457
2 0.176777 0.577036 28305 29925 0.945865 0.257613
3 0.577040 50708.000000 24607 29926 0.822262 -1.071254

mono_bin(data.SeriousDlqin2yrs,data.age)

============================================================
 min max sum total rate woe
0 21 30 7913 8885 0.890602 -0.506093
1 31 34 6640 7383 0.899363 -0.412828
2 35 38 7594 8386 0.905557 -0.342447
3 39 41 7131 7849 0.908523 -0.307262
4 42 43 4890 5362 0.911973 -0.265031
5 44 46 8163 8868 0.920501 -0.153830
6 47 48 5776 6274 0.920625 -0.152133
7 49 51 8545 9280 0.920797 -0.149768
8 52 53 5454 5901 0.924250 -0.101453
9 54 56 7922 8463 0.936075 0.080980
10 57 59 7517 7946 0.946011 0.260466
11 60 61 4942 5200 0.950385 0.349567
12 62 64 7464 7776 0.959877 0.571844
13 65 68 6968 7212 0.966167 0.748916
14 69 75 7911 8141 0.971748 0.934931
15 76 103 6620 6777 0.976833 1.138606
min max sum total rate woe
0 21 30 7913 8885 0.890602 -0.506093
1 31 34 6640 7383 0.899363 -0.412828
2 35 38 7594 8386 0.905557 -0.342447
3 39 41 7131 7849 0.908523 -0.307262
4 42 43 4890 5362 0.911973 -0.265031
5 44 46 8163 8868 0.920501 -0.153830
6 47 48 5776 6274 0.920625 -0.152133
7 49 51 8545 9280 0.920797 -0.149768
8 52 53 5454 5901 0.924250 -0.101453
9 54 56 7922 8463 0.936075 0.080980
10 57 59 7517 7946 0.946011 0.260466
11 60 61 4942 5200 0.950385 0.349567
12 62 64 7464 7776 0.959877 0.571844
13 65 68 6968 7212 0.966167 0.748916
14 69 75 7911 8141 0.971748 0.934931
15 76 103 6620 6777 0.976833 1.138606

mono_bin(data.SeriousDlqin2yrs,data.MonthlyIncome)

============================================================
 min max sum total rate woe
0 0.0 3400.0 27355 30073 0.909620 -0.293996
1 3401.0 5400.0 27655 30008 0.921588 -0.138884
2 5401.0 8200.0 27925 29725 0.939445 0.138736
3 8201.0 49750.0 28515 29897 0.953775 0.423899
min max sum total rate woe
0 0.0 3400.0 27355 30073 0.909620 -0.293996
1 3401.0 5400.0 27655 30008 0.921588 -0.138884
2 5401.0 8200.0 27925 29725 0.939445 0.138736
3 8201.0 49750.0 28515 29897 0.953775 0.423899

以上这篇浅谈pandas.cut与pandas.qcut的使用方法及区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用python检测主机存活端口及检查存活主机
Oct 12 Python
浅谈python装饰器探究与参数的领取
Dec 01 Python
tensorflow构建BP神经网络的方法
Mar 12 Python
python线程池threadpool使用篇
Apr 27 Python
对python Tkinter Text的用法详解
Oct 11 Python
Python小游戏之300行代码实现俄罗斯方块
Jan 04 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 Python
利用Python检测URL状态
Jul 31 Python
python模拟鼠标点击和键盘输入的操作
Aug 04 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
Oct 30 Python
Python图像处理库PIL的ImageFilter模块使用介绍
Feb 26 Python
Python 数据科学 Matplotlib图库详解
Jul 07 Python
python Plotly绘图工具的简单使用
Mar 03 #Python
python 函数嵌套及多函数共同运行知识点讲解
Mar 03 #Python
python实现扫雷游戏
Mar 03 #Python
python实现从ftp服务器下载文件
Mar 03 #Python
python实现简单的购物程序代码实例
Mar 03 #Python
python实现跨excel sheet复制代码实例
Mar 03 #Python
python剪切视频与合并视频的实现
Mar 03 #Python
You might like
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
ThinkPHP惯例配置文件详解
2014/07/14 PHP
thinkPHP模板算术运算相关函数用法分析
2016/07/12 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
php生成微信红包数组的方法
2019/09/05 PHP
js 图片轮播(5张图片)
2008/12/30 Javascript
jQuery总体架构的理解分析
2011/03/07 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
jQuery中:last-child选择器用法实例
2014/12/31 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
2015/12/04 Javascript
angular.js分页代码的实例
2016/07/27 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
深入理解React中何时使用箭头函数
2017/08/23 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
JavaScript中while循环的基础使用教程
2020/08/11 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
解决python 上传图片限制格式问题
2019/10/30 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
工厂搬迁方案
2014/05/11 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
小学教师个人总结
2015/02/05 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
中学教师教学工作总结
2015/08/13 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书