我有一个带有字符串列(名称:14)的数据集,我想将其转换为一个分类特性。据我所知有两种方法:
pd.Categorical(data[14])
data[14].astype('category')
虽然这两种方法产生的结果是相同的,但它们并不相同。
对结果调用
.dtype
会产生不同的输出。第一个输出关于各个类别的信息,而第二个(CategoricalDtype(categories=[' <=50K', ' >50K'], ordered=False)
)则生成带有count、unique、top、freq和name的典型描述输出,列出.describe()
。那么,我的问题是,它们为什么/如何不同?
就是这个数据集: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
最佳答案
作为Bakuriu points out,type(pd.Categorical(data[14]))
是Categorical
,而type(data[14].astype('category'))
是指:
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
Series
的行为不同因为
describe()
的定义与Categorical.describe
不同。每当您呼叫
Series.describe
,您将获得每个类别的Categorical.describe()
和count
:In [174]: cat.describe()
Out[174]:
counts freqs
categories
<=50K 24720 0.75919
>50K 7841 0.24081
每当你在分类序列中调用
freq
,就调用you'll get Series.describe()
, count
, unique
and top
。注意freq
和count
在这里也有不同的含义:In [175]: ser.describe()
Out[175]:
count 32561
unique 2
top <=50K
freq 24720
Name: 14, dtype: object
关于python - .astype('categorical')和`pd.Category(...)`之间的 Pandas 区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55012142/