我遇到了这种令人惊讶的无法访问我期望通过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列视为“分类”?我想我在这里缺少一些细微之处。熊猫类别值系列与熊猫分类数据类型有什么区别。
是否有另一种途径可以直接访问类别值系列的代码?
答案 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