Python 类别数据类型的行为不符合预期
我在下面有熊猫(版本0.15.2)数据框。我想在创建Python 类别数据类型的行为不符合预期,python,pandas,categorical-data,ordinal,Python,Pandas,Categorical Data,Ordinal,我在下面有熊猫(版本0.15.2)数据框。我想在创建df之后,使code列成为category类型的有序变量,如下所示 import pandas as pd df = pd.DataFrame({'id' : range(1,9), 'code' : ['one', 'one', 'two', 'three', 'two', 'three', 'one', 'two'],
df
之后,使code
列成为category
类型的有序变量,如下所示
import pandas as pd
df = pd.DataFrame({'id' : range(1,9),
'code' : ['one', 'one', 'two', 'three',
'two', 'three', 'one', 'two'],
'amount' : np.random.randn(8)}, columns= ['id','code','amount'])
df.code = df.code.astype('category')
>> 0 one
>> 1 one
>> 2 two
>> 3 three
>> 4 two
>> 5 three
>> 6 one
>> 7 two
>> Name: code, dtype: category
>> Categories (3, object): [one < three < two]
甚至:
df.code.ordered
>> error: 'Series' object has no attribute 'ordered'
df.code.categories
>> error: 'Series' object has no attribute 'categories'
1)这太烦人了。我甚至无法获得我的category
变量的类别(级别)。我是否做错了什么,或者web文档是否过时/不一致
2)另外,您是否知道类型
category
是否有距离概念,即熊猫是否知道根据上述顺序,one
比thire
更接近two
?我计划将其用于(dis)相似性计算。我认为您无法指定顺序,似乎给出了该选项,但尚未实现,请参阅
根据您所描述的内容,您正在寻找将code
变量编码为顺序变量,而不是分类变量,这是一个简单的过程
如果您可以假设“一”和“二”之间的差异等于“二”和“三”之间的差异。我想你可以把它们编码成int
s(0,1,2,3…
)
如果使用,则有一个这里有一个简短的示例,其中包含一个有序的分类变量,并且(对我来说)使用rank()
(作为一种距离度量)得到了一个令人惊讶的结果:
因此,sort()
按指定的顺序按预期工作。但是rank()
并不像我想象的那样,它按字典顺序排列,并忽略了分类变量的顺序
df.sort('code').rank()
code num
0 1.5 1.5
3 1.5 1.5
1 4.0 3.0
2 3.0 4.0
所有这些都可能是一个较长的提问方式:也许你只是想要一个整数类型?我的意思是,你可以在排序后在这里构造某种距离函数,但最终这将比使用标准int或float做的工作要多得多(如果你看看rank()
如何处理有序的分类,可能会有问题)
编辑添加:上述部分内容可能不适用于pandas 15.2,但我相信您仍然可以这样做来指定顺序:
df['code'].cat.categories = ['one','two','three']
在15.2中默认情况下(据我所知),ordered将默认为True(但在16.0版本中为False),但顺序将是按字典顺序排列的,而不是按照构造函数中的指定。不过我不确定,而且我正在16.0中工作,因此您只需观察您的版本的行为。请记住,Category仍然是一个相当新的…名称“Category”意味着没有排序。如果有排序,数据将是有序的,而不是分类的。这是我最初的想法,但如果你检查我包含的文档链接,你会发现它们实际上允许排序。是的,排序是有序的,但不是基数。因此“一”比“三”更接近“二”,但“二”不是将“1”的值加倍。是否确实不希望在此处仅使用整数?如果2实际上意味着2,则不希望使用分类变量。如果确实希望在此处使用分类变量,则“距离”的任何概念本质上都是基于排序的。是的,1-2只是(可能不好)我为论证而创建的示例。我需要序数变量。整数是序数的(在实践中)谢谢,绝对允许顺序规范。我对实现和语法更困惑。我使用的是熊猫版本0.15.2,您使用的是哪个版本?此语法在我的机器上不起作用:df.cat.astype('category',categories=['one','two','three','ordered=True)
它抛出:错误:astype()得到了一个意外的关键字参数“categories”
。是的,我想是这样。我认为这只是令人失望的是,在这个阶段,pd.Categorical
是多么的无益。我不确定它现在可以解决什么用例。它看起来在16.0中使用astype参数的功能是新的,但我非常确定您仍然可以在15.2.T中使用ordered他提到ordered是15年的默认值,现在unordered是默认值。不幸的是,0.15.2版本肯定无法识别df.code.ordered
或df.code.categories
。它只是在我的问题中抛出语法错误。我认为它必须是df.cat.code.categories
。我想我可能是因为tally在“cat”中选择了一个非常糟糕的列名(我会更改它)。看起来您需要像“str”或“dt”一样使用“cat”。
df.sort('code').rank()
code num
0 1.5 1.5
3 1.5 1.5
1 4.0 3.0
2 3.0 4.0
df['code'].cat.categories = ['one','two','three']