Pandas | 23 分类数据

一般实时的数据包括重复的文本列。例如:性别,国家和代码等特征老是重复的。这些是分类数据的例子。python

分类变量只能采用有限的数量,并且一般是固定的数量。除了固定长度,分类数据可能有顺序,但不能执行数字操做。 分类是Pandas数据类型。shell

分类数据类型在如下状况下很是有用 -数组

  • 一个字符串变量,只包含几个不一样的值。将这样的字符串变量转换为分类变量将会节省一些内存。
  • 变量的词汇顺序与逻辑顺序("one""two""three")不一样。 经过转换为分类并指定类别上的顺序,排序和最小/最大将使用逻辑顺序,而不是词法顺序。
  • 做为其余python库的一个信号,这个列应该被看成一个分类变量(例如,使用合适的统计方法或plot类型)。

对象建立

分类对象能够经过多种方式建立。下面介绍了不一样的方法 -函数

类别/分类spa

经过在pandas对象建立中将dtype指定为“category”code

import pandas as pd

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

输出结果 -对象

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

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

pd.Categorical排序

使用标准Pandas分类构造函数,咱们能够建立一个类别对象。语法以下 -three

 
pandas.Categorical(values, categories, ordered)

举个例子 -

 
import pandas as pd

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

输出结果 -

[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)

输出结果 -

[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)

输出结果:

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

从逻辑上讲,排序(ordered)意味着,a大于bb大于c

描述

使用分类数据上的.describe()命令,能够获得与类型字符串的Series或DataFrame相似的输出。

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 ("=============================")
print (df["cat"].describe())

输出结果:

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命令用于获取对象的类别。

import pandas as pd
import numpy as np

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

输出结果:

Index(['b', 'a', '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)

输出结果:

False
 

该函数返回结果为:False,由于这里没有指定任何顺序。

重命名类别

重命名类别是经过将新值分配给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)

输出结果:

Index(['Group a', 'Group b', '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)
输出结果:
Index(['a', 'b', '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("=====================================")
print ("After removal:")
print (s.cat.remove_categories("a"))

输出结果:

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]
 

分类数据的比较

在三种状况下能够将分类数据与其余对象进行比较 -

  • 将等号(==!=)与类别数据相同长度的相似列表的对象(列表,系列,数组…)进行比较。
  • ordered==True和类别是相同时,全部比较(==!=>>=<,和<=)分类数据到另外一个分类系列。
  • 将分类数据与标量进行比较。

看看下面的例子 -

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)

输出结果:

0 False 1 False 2 True dtype: bool
相关文章
相关标签/搜索