如何在python中从顺序变量创建数字类别?

如何在python中从顺序变量创建数字类别?,python,pandas,spss,Python,Pandas,Spss,我已经被关了好几天,试图从值的聚合中创建一个新的分类变量​​从一个顺序变量。 我正在使用Pandas将语法脚本从SPSS迁移到Python 在SPSS中,我使用以下命令执行我需要的操作: RECODE QTD_FTE_RAZAO (0=5) (1 thru 3000 = 0) (3000.01 thru 4000 = 1) (4000.01 thru 5000 = 2) (5000.01 thru 10000 = 3) (10000.01 thru 15000 = 4) (15000.01 th

我已经被关了好几天,试图从值的聚合中创建一个新的分类变量​​从一个顺序变量。 我正在使用Pandas将语法脚本从SPSS迁移到Python 在SPSS中,我使用以下命令执行我需要的操作:

RECODE QTD_FTE_RAZAO (0=5) (1 thru 3000 = 0) (3000.01 thru 4000 = 1) (4000.01 thru 5000 = 2) (5000.01 thru 10000 = 3) (10000.01 thru 15000 = 4) (15000.01 thru 9999999999 = 5)
INTO COD_FTE_RAZAO.
EXECUTE.
我查看了pandas cut函数,但它不起作用,因为它创建文本对象,而且我无法编写所需的参数

我需要把它变成价值观​​因为我将创建一个索引。我将创建5个变量类别,并在最后添加值​​并创建一个索引。这就是为什么我需要把这些范围转换成数字

最简单的方法是做一个函数


我完全迷路了,有人能帮帮我吗?

使用手工生成的数据,
pd.cut
使用显式垃圾桶将
val
转换为垃圾桶类别

df = pd.DataFrame([{'val': 5}, {'val': 500},{'val': 5000},{'val': 2000},{'val': 3500},{'val': 6000},{'val': 12000},{'val': 500000}])
df['vars'] = pd.cut(df['val'],bins=[1, 3000, 4000, 5000, 10000, 15000, float('inf')])
df
结果是下表的前两列。如果要将它们转换为某种类型的整数,可以使用
df['code']=df.vars.cat.codes
按索引顺序映射类别

      val                vars  codes
0       5       (1.0, 3000.0]      0
1     500       (1.0, 3000.0]      0
2    5000    (4000.0, 5000.0]      2
3    2000       (1.0, 3000.0]      0
4    3500    (3000.0, 4000.0]      1
5    6000   (5000.0, 10000.0]      3
6   12000  (10000.0, 15000.0]      4
7  500000      (15000.0, inf]      5

正如用户所评论的,如果您不希望有中间列,并且希望得到的标签不一定是这些箱子的整数索引,那么将
labels=[0,1,2,3,4,5]
(或包含适当标签的列表)传递到
pd.cut

为什么
pd.cut
不起作用?你可能也想看看。另外,请看。因为我需要输入我需要的值。例如,如果10到20=5,如果50到100=1。感谢您的建议您不能同时使用
垃圾箱
标签
参数吗?首先指定仓位值,然后将标签添加到返回的仓位
pd.cut(df[col],bins=[1,5,10],labels=[3,18])
(你可以为区间范围指定任何你想要的标签)谢谢,我这样做了:index['cod_fte_razao']=pd.cut(index['qtd_fte_razao',bins=[1,3000,4000,5000,10000,15000,float('inf')],labels=[5,0,1,2,3,4,5])print(index.head())我得到了这个错误:ValueError:Bin标签必须比Bin边的数量少一个我想这是因为我使用了两次相同的代码。这是因为您为Bin提供了错误的标签数量。谢谢,是的,您是对的,但现在我遇到了这个问题。分类类别必须是唯一的。实际上,为了计算我的索引,我需要将第一个类别和最后一个类别的值相同。还有其他解决方案吗?首先,想想你在做什么,以及你是否真的需要在第一个和最后一个类别中使用相同的值,因为(1)你的原始代码没有这个值,(2)我想不出任何理由这样做。然而,解决方案是在分类后仅替换值。