看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
分类数据(Categorical data)具有较高的理解和执行效率,可以通过多种方式创建 Series 或者 DataFrame 中的列。
使用 dtype="category"
来指定数据类型:
s = pd.Series(["a", "b", "c", "a"], dtype="category")
s
'''
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
'''
.astype('category')
可以转换为分类数据:
df = pd.DataFrame({"A": ["a", "b", "c", "a"]})
df["B"] = df["A"].astype('category')
一些特殊的方法下,会自动创建分类数据类型:
df = pd.DataFrame({'value': np.random.randint(0, 100, 20)})
labels = ["{0} - {1}".format(i, i + 9) for i in range(0, 100, 10)]
df['group'] = pd.cut(df.value, range(0, 105, 10), right=False, labels=labels)
df.head(10)
df.dtypes
'''
value int64
group category
dtype: object
'''
pandas.Categorical 可以创建一个类型数据序列到 DataFrame 中:
raw_cat = pd.Categorical(["a", "b", "c", "a"],
categories=["b", "c", "d"],
ordered=False)
s = pd.Series(raw_cat)
'''
Out[12]:
0 NaN
1 b
2 c
3 NaN
dtype: category
Categories (3, object): [b, c, d]
'''
df = pd.DataFrame({"A": ["a", "b", "c", "a"]})
df["B"] = raw_cat
df
'''
A B
0 a NaN
1 b b
2 c c
3 a NaN
'''
df.dtypes
'''
A object
B category
dtype: object
'''
与将单个列转换为分类相似,可以在构造期间或构造之后将 DataFrame 中的所有列批量转换为分类的类别。
df = pd.DataFrame({'A': list('abca'), 'B': list('bccd')}, dtype="category")
df.dtypes
'''
A category
B category
dtype: object
'''
df['A']
'''
0 a
1 b
2 c
3 a
Name: A, dtype: category
Categories (3, object): [a, b, c]
'''
也可以用 df.astype('category')
进行转换。
CategoricalDtype
是 pandas 的类型数据对象,它可以传入以下参数:
CategoricalDtype(['a', 'b', 'c'])
# CategoricalDtype(categories=['a', 'b', 'c'], ordered=False)
CategoricalDtype(['a', 'b', 'c'], ordered=True)
# CategoricalDtype(categories=['a', 'b', 'c'], ordered=True)
CategoricalDtype()
# CategoricalDtype(categories=None, ordered=False)
CategoricalDtype 可以在 Pandas 指定 dtype 的任何地方,例如pandas.read_csv(),pandas.DataFrame.astype() 或 Series 构造函数中。
为方便起见,当您希望类别的默认行为是无序的并且等于数组中的设置值时,可以使用字符串 'category' 代替 CategoricalDtype。 换句话说,dtype='category' 等效于 dtype = CategoricalDtype()。
只要 CategoricalDtype 的两个实例具有相同的类别和顺序,它们的比较就相等。 比较两个无序分类时,不考虑类别的顺序。
以上的例子中我们使用 dtype='category'
指定了分类数据类型,其中:
我们也可以使用 CategoricalDtype
实例来定义分类数据,同时还可以给定顺序:
from pandas.api.types import CategoricalDtype
s = pd.Series(["a", "b", "c", "a"])
cat_type = CategoricalDtype(categories=["b", "c", "d"],
ordered=True)
s_cat = s.astype(cat_type)
s_cat
'''
0 NaN
1 b
2 c
3 NaN
dtype: category
Categories (3, object): [b < c < d]
'''
同样,CategoricalDtype可与DataFrame一起使用,以确保类别在所有列之间是一致的。
from pandas.api.types import CategoricalDtype
df = pd.DataFrame({'A': list('abca'), 'B': list('bccd')})
cat_type = CategoricalDtype(categories=list('abcd'),
ordered=True)
df_cat = df.astype(cat_type)
df_cat['A']
'''
0 a
1 b
2 c
3 a
Name: A, dtype: category
Categories (4, object): [a < b < c < d]
'''
可以抽取分类数据:
categories = pd.unique(df.to_numpy().ravel())
如果已经有了 code 和类别,则可以使用 from_codes() 构造函数在常规构造函数模式下保存分解步骤:
splitter = np.random.choice([0, 1], 5, p=[0.5, 0.5])
s = pd.Series(pd.Categorical.from_codes(splitter,
categories=["train", "test"]))
若要返回原始 Series 或 NumPy 数组,请使用 Series.astype(original_dtype) 或np.asarray(original_dtype):
s = pd.Series(["a", "b", "c", "a"])
s
'''
0 a
1 b
2 c
3 a
dtype: object
'''
s2 = s.astype('category')
s2
'''
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
'''
s2.astype(str)
'''
0 a
1 b
2 c
3 a
dtype: object
'''
np.asarray(s2)
# array(['a', 'b', 'c', 'a'], dtype=object)
更新时间:2020-06-25 11:36:07 标签:pandas 分类数据