pandas系列类别数据类型与pandas分类数据类型之间的区别

时间:2019-01-16 19:34:03

标签: python pandas

我遇到了这种令人惊讶的无法访问我期望通过codes强制转换为类别类型的CSV数据列的dtype属性的问题read_csv的参数。

如果我运行以下代码

import pandas

csv_str = """c1,c2
a,1
b,2
a,3
c,4
a,5"""

df = pandas.read_csv( pandas.compat.StringIO( csv_str ) , dtype={'c1':'category'} )

print( "DataFrame\n{}".format( df ))
print( "\nDataTypes\n{}".format( df.dtypes ))
print( "\nDataCodes\n{}".format( pandas.Categorical( df['c1'] ).codes ))

# EXCEPTION
print( df['c1'].codes )

我得到以下控制台输出

DataFrame
  c1  c2
0  a   1
1  b   2
2  a   3
3  c   4
4  a   5

DataTypes
c1    category
c2       int64
dtype: object

DataCodes
[0 1 0 2 0]
Traceback (most recent call last):
  File "/Users/$USER/test.py", line 17, in <module>
    print( df['c1'].codes )
  File "/Users/$USER/Applications_User/anaconda2/lib/python2.7/site-packages/pandas/core/generic.py", line 4376, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'Series' object has no attribute 'codes'

这到底是怎么回事,为什么我不能将属于类别类型的c1列视为“分类”?我想我在这里缺少一些细微之处。熊猫类别值系列与熊猫分类数据类型有什么区别。

是否有另一种途径可以直接访问类别值系列的代码?

1 个答案:

答案 0 :(得分:1)

pd.Categorical返回Categorical类型的对象:

c = pd.Categorical(df['c1'])
c
# [a, b, a, c, a]
# Categories (3, object): [a, b, c]

type(c)
pandas.core.arrays.categorical.Categorical

OTOH,df['c1']是类型Series的{​​{1}}。这意味着必须通过.cat accessor访问其分类属性和功能。

categorical