Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类别数据类型的行为不符合预期_Python_Pandas_Categorical Data_Ordinal - Fatal编程技术网

Python 类别数据类型的行为不符合预期

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'],

我在下面有熊猫(版本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'],
                    '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']