Python Pandas 简明教程
Python Pandas - Categorical Data
通常在实时数据中,将包含重复的文本列。性别、国家和代码等要素始终是重复的。这些是分类数据的示例。
分类变量只能取有限且通常是固定数量的可能值。除了固定长度外,分类数据可能存在顺序,但不能执行数值操作。分类是熊猫数据类型。
分类数据类型在以下情况下有用−
-
仅包含几个不同值的字符串变量。将这种字符串变量转换为分类变量将节省一些内存。
-
变量的字典顺序与逻辑顺序不同(“一”、“二”、“三”)。通过转换为分类并在类别上指定顺序,排序和 min/max 将使用逻辑顺序而不是字典顺序。
-
作为对其他 Python 库的信号,表明此列应视为分类变量(例如,使用合适的统计方法或绘图类型)。
Object Creation
分类对象可以通过多种方式创建。以下介绍了不同的方式-
category
在熊猫对象创建中将 dtype 指定为“类别”。
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]
传递给 series 对象的元素数量为四个,但类别只有三个。在输出类别中观察相同的内容。
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 大于 b , b 大于 c 。
Description
使用分类数据上的 .describe() 命令,我们得到一个类似于 type 字符串中的 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 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
Get the Properties of the Category
obj.cat.categories 命令用于获取 categories 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 ,因为我们没有指定任何顺序。
Renaming Categories
通过将新值赋值给 *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')
对象的 s.cat.categories 属性更新了初始类别 [a,b,c] 。
Appending New 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')
Removing Categories
使用 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]
Comparison of Categorical Data
在三个情况下,分类数据与其他对象进行比较 -
-
与与分类数据长度相同的类似列表的对象(列表、序列、数组等)比较相等(== 和 !=)。
-
当 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
它的 output 如下所示 −
0 False
1 False
2 True
dtype: bool