Python Pandas 分类数据

Python Pandas 分类数据

在实时数据中,常常包含重复的文本列。像性别、国家和代码等特征总是重复的。这些就是分类数据的例子。

分类变量只能有有限数量的可能值,通常是固定的。除了长度固定之外,分类数据可能有一个顺序,但不能进行数值操作。分类是Pandas的一种数据类型。

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

  • 只包含少数不同值的字符串变量。将这样的字符串变量转换为分类变量可以节省一些内存。

  • 变量的词典顺序与逻辑顺序不相同(”one”,”two”,”three”)。通过将其转换为分类变量并指定类别的顺序,排序和min/max将使用逻辑顺序而不是词典顺序。

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

对象创建

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

分类

在Pandas对象创建时,将dtype指定为”category”。

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 大于 b 并且 b 大于 c

describe

在分类数据上使用 .describe() 命令,我们得到与 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()

输出如下所示- 输出

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

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([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]

分类数据的比较

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

  • 将等号( and !=)与与分类数据长度相同的列表样对象(列表,Series,数组等)进行比较。

  • 当orderedTrue且分类相同时,将分类数据的所有比较(,!=,>,>=,<,<=)与另一个分类Series进行比较。

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

看下面的例子:

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程