Pandas - 数据分类

  • 简述

    通常是实时的,数据包括重复的文本列。性别、国家和代码等特征总是重复的。这些是分类数据的示例。
    分类变量只能采用有限且通常固定数量的可能值。除了固定长度外,分类数据可能有顺序但不能进行数值运算。分类是 Pandas 数据类型。
    分类数据类型在以下情况下很有用 -
    • 仅由几个不同值组成的字符串变量。将这样的字符串变量转换为分类变量将节省一些内存。
    • 变量的词法顺序与逻辑顺序不同(“一”、“二”、“三”)。通过转换为分类并指定类别的顺序,排序和最小/最大将使用逻辑顺序而不是词法顺序。
    • 作为向其他 python 库的信号,应将此列视为分类变量(例如,使用合适的统计方法或绘图类型)。
  • 对象创建

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

    类别

    通过在 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.分类的

    使用标准的 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大于bb大于c.

    描述

    使用.describe()分类数据上的命令,我们得到类似的输出Series要么DataFrametype细绳。
    
    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命令用于获取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
    
    它的输出如下 -
    
    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.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]
    

    分类数据的比较

    在三种情况下可以将分类数据与其他对象进行比较 -
    • 将相等性(== 和 !=)与与分类数据长度相同的类似列表的对象(列表、系列、数组...)进行比较。
    • 分类数据与另一个分类系列的所有比较(==、!=、>、>=、< 和 <=),当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