鱼C论坛

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

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

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

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

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

x
1.现有一组记录客户id,年龄及是否正常还款的数据,想要以年龄进行分箱,之后分析不同年龄段的还款能力差异,代码如下:
  1. df_3=pd.read_excel('D:\数据统计分析\客户还款能力分析.xlsx')
  2. bins=[19,30,40,50,60,70]
  3. 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()实例对象,才有 , 如

  1. >>> import pandas as pd
  2. >>> pd.__version__
  3. '1.1.4'

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

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

  19. # 补充:或者用 .cat "类别读取器"
  20. >>> df.ct.cat
  21. <pandas.core.arrays.categorical.CategoricalAccessor object at 0x00000241AE7503C8>
  22. >>> df.ct.cat.codes
  23. 0    0
  24. 1    0
  25. 2    1
  26. 3    2
  27. dtype: int8
  28. >>> df.ct.cat.categories
  29. Index(['青年', '中年', '老年'], dtype='object')
  30. >>>
复制代码


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

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

  1. >>> import pandas as pd
  2. >>> pd.__version__
  3. '1.1.4'

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

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

  19. # 补充:或者用 .cat "类别读取器"
  20. >>> df.ct.cat
  21. <pandas.core.arrays.categorical.CategoricalAccessor object at 0x00000241AE7503C8>
  22. >>> df.ct.cat.codes
  23. 0    0
  24. 1    0
  25. 2    1
  26. 3    2
  27. dtype: int8
  28. >>> df.ct.cat.categories
  29. Index(['青年', '中年', '老年'], dtype='object')
  30. >>>
复制代码


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

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,谢谢你这么认真的解答~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 09:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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