Python Pandas 分类数据
通常是实时的,数据包括重复的文本列。性别、国家和代码等特征总是重复的。这些是分类数据的示例。
分类变量只能采用有限的、通常是固定数量的可能值。除了固定长度外,分类数据可能有顺序但不能进行数值运算。分类是 Pandas 数据类型。
分类数据类型在以下情况下很有用:
仅由几个不同值组成的字符串变量。将这样的字符串变量转换为分类变量将节省一些内存。
变量的词汇顺序与逻辑顺序(“一”、“二”、“三”)不同。通过转换为分类并指定类别的顺序,排序和最小/最大将使用逻辑顺序而不是词法顺序。
作为其他 python 库的信号,该列应被视为分类变量(例如,使用合适的统计方法或绘图类型)。
创建对象
可以通过多种方式创建分类对象,不同的方式描述如下:
category
通过在 Pandas 对象创建中将 dtype 指定为“类别”。
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]
传递给系列对象的元素数量是四个,但类别只有三个。在输出类别中观察相同。
pd.Categorical
使用标准的 pandas Categorical 构造函数,我们可以创建一个类别对象。
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]
从逻辑上讲,该顺序意味着,a大于bandb大于c.
描述
使用。描述()命令对分类数据,我们得到类似的输出Seriesor数据框of thetypestring.
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()
输出如下:
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([u'b', u'a', u'c'], dtype='object')
对象有序命令用于获取对象的顺序。
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因为我们没有指定任何顺序。
重命名类别
重命名类别是通过为系列.cat.categoriesseries.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([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
输出如下:
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")
输出如下:
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]
分类数据的比较
在三种情况下可以将分类数据与其他对象进行比较:
将相等性(== 和 !=)与 与分类数据的长度相同。
分类数据与另一个数据的所有比较(==、!=、>、>=、< 和 <=) categorical Series,当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