鱼C论坛

 找回密码
 立即注册
查看: 1570|回复: 2

[已解决]关于pandas使用cut函数进行分箱的几个问题

[复制链接]
发表于 2022-4-5 20:44:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.现有一组记录客户id,年龄及是否正常还款的数据,想要以年龄进行分箱,之后分析不同年龄段的还款能力差异,代码如下:
df_3=pd.read_excel('D:\数据统计分析\客户还款能力分析.xlsx')
bins=[19,30,40,50,60,70]
sections=pd.cut(df_3['age'],bins)
得到的结果是这样的:
0      (19, 30]
1      (19, 30]
2      (19, 30]
3      (19, 30]
4      (19, 30]
         ...   
495    (60, 70]
496    (60, 70]
497    (60, 70]
498    (60, 70]
499    (60, 70]
Name: age, Length: 500, dtype: category
Categories (5, interval[int64]): [(19, 30] < (30, 40] < (40, 50] < (50, 60] < (60, 70]]
看上去返回的是一个category对象,但是我使用type(sexction)时返回的结果是pandas.core.series.Series
然后按照书上的说法,这个sections对象有两个属性codes和categories,在我访问这两个属性的时候给出的报错是:
AttributeError: 'Series' object has no attribute 'codes;
AttributeError: 'Series' object has no attribute 'categories'
该如何解决?

2.pd.cut方法有一个precision参数说是可以改变分箱边界的数字精度,这个是在什么场景下起作用?能帮忙举个例子嘛?

3.pd.cut方法有一个duplicates参数看上去是删除重复值的意思,这个是在什么场景下起作用?能帮忙举个例子嘛?
最佳答案
2022-4-6 17:49:18
本帖最后由 阿奇_o 于 2022-4-6 17:54 编辑

那是旧版本的pandas吧,要看你现在用的是哪个版本。  
我这是1.1.4版本,也没有了那两个属性,然后我查了下,是要 转为pandas.Categorical()实例对象,才有 , 如
>>> import pandas as pd
>>> pd.__version__
'1.1.4'

>>> df = pd.DataFrame({'name':list('ABCD'), 'age':[19, 30, 50, 65]})
>>> df['ct'] = pd.cut(df.age, bins=[18,30,50,99], labels=['青年', '中年', '老年'])
>>> df
  name  age  ct
0    A   19  青年
1    B   30  青年
2    C   50  中年
3    D   65  老年

>>> pd.Categorical(df.ct)
['青年', '青年', '中年', '老年']
Categories (3, object): ['青年' < '中年' < '老年']
>>> pd.Categorical(df.ct).codes
array([0, 0, 1, 2], dtype=int8)
>>> pd.Categorical(df.ct).categories
Index(['青年', '中年', '老年'], dtype='object')

# 补充:或者用 .cat "类别读取器"
>>> df.ct.cat
<pandas.core.arrays.categorical.CategoricalAccessor object at 0x00000241AE7503C8>
>>> df.ct.cat.codes
0    0
1    0
2    1
3    2
dtype: int8
>>> df.ct.cat.categories
Index(['青年', '中年', '老年'], dtype='object')
>>> 

其他的问题,自己查查官方文档和用户手册。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-6 17:49:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2022-4-6 17:54 编辑

那是旧版本的pandas吧,要看你现在用的是哪个版本。  
我这是1.1.4版本,也没有了那两个属性,然后我查了下,是要 转为pandas.Categorical()实例对象,才有 , 如
>>> import pandas as pd
>>> pd.__version__
'1.1.4'

>>> df = pd.DataFrame({'name':list('ABCD'), 'age':[19, 30, 50, 65]})
>>> df['ct'] = pd.cut(df.age, bins=[18,30,50,99], labels=['青年', '中年', '老年'])
>>> df
  name  age  ct
0    A   19  青年
1    B   30  青年
2    C   50  中年
3    D   65  老年

>>> pd.Categorical(df.ct)
['青年', '青年', '中年', '老年']
Categories (3, object): ['青年' < '中年' < '老年']
>>> pd.Categorical(df.ct).codes
array([0, 0, 1, 2], dtype=int8)
>>> pd.Categorical(df.ct).categories
Index(['青年', '中年', '老年'], dtype='object')

# 补充:或者用 .cat "类别读取器"
>>> df.ct.cat
<pandas.core.arrays.categorical.CategoricalAccessor object at 0x00000241AE7503C8>
>>> df.ct.cat.codes
0    0
1    0
2    1
3    2
dtype: int8
>>> df.ct.cat.categories
Index(['青年', '中年', '老年'], dtype='object')
>>> 

其他的问题,自己查查官方文档和用户手册。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-6 21:23:27 | 显示全部楼层
阿奇_o 发表于 2022-4-6 17:49
那是旧版本的pandas吧,要看你现在用的是哪个版本。  
我这是1.1.4版本,也没有了那两个属性,然后我查了 ...

好的,谢谢你这么认真的解答~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-11 19:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表