Categorical Data

优质
小牛编辑
132浏览
2023-12-01

通常是实时的,数据包括重复的文本列。 性别,国家/地区和代码等功能始终重复。 这些是分类数据的示例。

分类变量只能采用有限且通常固定数量的可能值。 除固定长度外,分类数据可能有订单但不能执行数字操作。 分类是Pandas数据类型。

分类数据类型在以下情况下很有用 -

  • 字符串变量,仅包含几个不同的值。 将这样的字符串变量转换为分类变量将节省一些内存。

  • 变量的词法顺序与逻辑顺序(“一”,“二”,“三”)不同。 通过转换为分类并在类别上指定顺序,排序和最小/最大将使用逻辑顺序而不是词法顺序。

  • 作为向其他python库发出的信号,该列应被视为分类变量(例如,使用合适的统计方法或绘图类型)。

对象创建

可以通过多种方式创建分类对象。 以下描述了不同的方式 -

category

通过在pandas对象创建中将dtype指定为“category”。

import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print s

output如下 -

0  a
1  b
2  c
3  a
dtype: category
Categories (3, object): [a, b, c]

传递给系列对象的元素数量是四个,但类别只有三个。 在输出类别中观察相同。

pd.Categorical

使用标准pandas分类构造函数,我们可以创建一个类别对象。

pandas.Categorical(values, categories, ordered)

我们来举个例子 -

import pandas as pd
cat = pd.Categorical(['a', 'b', 'c', 'a', 'b', 'c'])
print cat

output如下 -

[a, b, c, a, b, c]
Categories (3, object): [a, b, c]

我们有另一个例子 -

import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'])
print cat

output如下 -

[a, b, c, a, b, c, NaN]
Categories (3, object): [c, b, a]

这里,第二个参数表示类别。 因此,类别中不存在的任何值将被视为NaN

现在,看看下面的例子 -

import pandas as pd
cat = cat=pd.Categorical(['a','b','c','a','b','c','d'], ['c', 'b', 'a'],ordered=True)
print cat

output如下 -

[a, b, c, a, b, c, NaN]
Categories (3, object): [c < b < a]

逻辑上,顺序意味着, a大于bb大于c

描述 (Description)

对分类数据使用.describe()命令,我们得到type字符串的SeriesDataFrame的类似输出。

import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
df = pd.DataFrame({"cat":cat, "s":["a", "c", "c", np.nan]})
print df.describe()
print df["cat"].describe()

output如下 -

       cat s
count    3 3
unique   2 2
top      c c
freq     2 2
count     3
unique    2
top       c
freq      2
Name: cat, dtype: object

获取类别的属性

obj.cat.categories命令用于获取categories of the objectcategories of the object

import pandas as pd
import numpy as np
s = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print s.categories

output如下 -

Index([u'b', u'a', u'c'], dtype='object')

obj.ordered命令用于获取对象的顺序。

import pandas as pd
import numpy as np
cat = pd.Categorical(["a", "c", "c", np.nan], categories=["b", "a", "c"])
print cat.ordered

output如下 -

False

函数返回false因为我们没有指定任何顺序。

重命名类别

重命名类别是通过为series.cat.categories series.cat.categories属性分配新值来完成的。

import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s.cat.categories = ["Group %s" % g for g in s.cat.categories]
print s.cat.categories

output如下 -

Index([u'Group a', u'Group b', u'Group c'], dtype='object')

初始类别[a,b,c]由对象的s.cat.categories属性更新。

附加新类别

使用Categorical.add.categories()方法,可以追加新的类别。

import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
s = s.cat.add_categories([4])
print s.cat.categories

output如下 -

Index([u'a', u'b', u'c', 4], dtype='object')

删除类别

使用Categorical.remove_categories()方法,可以删除不需要的类别。

import pandas as pd
s = pd.Series(["a","b","c","a"], dtype="category")
print ("Original object:")
print s
print ("After removal:")
print s.cat.remove_categories("a")

output如下 -

Original object:
0  a
1  b
2  c
3  a
dtype: category
Categories (3, object): [a, b, c]
After removal:
0  NaN
1  b
2  c
3  NaN
dtype: category
Categories (2, object): [b, c]

分类数据的比较

在三种情况下,可以将分类数据与其他对象进行比较 -

  • 将等式(==和!=)与类别列表对象(列表,系列,数组等)进行比较,其长度与分类数据相同。

  • 所有比较(==,!=,>,> =,

  • 将分类数据与标量进行所有比较。

看看下面的例子 -

import pandas as pd
cat = pd.Series([1,2,3]).astype("category", categories=[1,2,3], ordered=True)
cat1 = pd.Series([2,2,2]).astype("category", categories=[1,2,3], ordered=True)
print cat>cat1

output如下 -

0  False
1  False
2  True
dtype: bool