.astype('categorical')和`pd.Category(...)`之间的熊猫区别

时间:2019-03-05 21:49:21

标签: python pandas

我有一个带有字符串列(名称:14)的数据集,我想将其转换为解释为分类特征。据我所知,有两种方法可以做到这一点:

pd.Categorical(data[14])
data[14].astype('category')

尽管两者产生的结果都相同,.dtypeCategoricalDtype(categories=[' <=50K', ' >50K'], ordered=False)却并不相同。

在结果上调用.describe()会产生不同的输出。第一个输出有关各个类别的信息,而第二个(astype(..))产生典型的描述输出,其中包含计数,唯一,顶部,频率和名称,并列出dtype: object

那么我的问题是,为什么/它们有何不同?


这是数据集:http://archive.ics.uci.edu/ml/datasets/Adult

data = pd.read_csv("./adult/adult.data", header=None)

pd.Categorical(data[14]).describe()
data[14].astype('category').describe()

pd.Categorical(data[14]).dtype
data[14].astype('category').dtype

1 个答案:

答案 0 :(得分:2)

Bakuriu points out一样,type(pd.Categorical(data[14]))Categorical,而 type(data[14].astype('category'))Series

import pandas as pd
data = pd.read_csv("./adult/adult.data", header=None)

cat = pd.Categorical(data[14])
ser = data[14].astype('category')
print(type(cat))
# pandas.core.arrays.categorical.Categorical
print(type(ser))
# pandas.core.series.Series

describe()的行为不同 因为Categorical.describe的定义与Series.describe的定义不同。

每当您致电Categorical.describe()时,每个类别都会得到countfreq

In [174]: cat.describe()
Out[174]: 
            counts    freqs
categories                 
 <=50K       24720  0.75919
 >50K         7841  0.24081

,并且每当您在分类系列you'll get count, unique, top and freq上致电Series.describe()时。请注意,countfreq在这里也有不同的含义:

In [175]: ser.describe()
Out[175]: 
count      32561
unique         2
top        <=50K
freq       24720
Name: 14, dtype: object