我有一个带有字符串列(名称: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 outtype(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。注意freqcount在这里也有不同的含义:
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/

10-08 22:39