处理分类数组

对于已有分类数组的元素,主要有增、删、改和查等操作。[大谦MATLAB,dqmatlab点com]

查找分类值

查找分类值,指的是对分类数组中的元素进行索引和切片。通过布尔索引,可以对分类数组中的元素进行筛选。

【MATLAB】

下面创建一个分类数组S。

code.matlab
>> S=categorical({'XL';'L';'M';'S';'M';'L';'XXL'})

通过索引获取分类数组中的第2个元素。

code.matlab
>> S(2)    %索引
ans=
  categorical
     L

通过切片获取分类数组中的第1到第3个元素。

code.matlab
>> S(1:3)    %切片
ans=
  3×1 categorical 数组
     XL
     L
	M

【Python】

在Python中,首先用Categorical函数创建一个分类数组cat。

code.python
>>> import pandas as pd
>>> cat=pd.Categorical(['XL', 'L', 'M', 'S', 'M', 'L', 'XXL'])

通过索引获取分类数组中的第2个元素。

code.python
>>> cat[1]
'L'

通过切片获取分类数组中的第1到第3个元素。

code.python
>>> cat[0:2]
['XL', 'L']
Categories(5, object): ['L', 'M', 'S', 'XL', 'XXL']

下面通过布尔索引对分类数组中的元素进行筛选。

【MATLAB】

首先用categorical函数创建分类数组S。

code.matlab
>> S=categorical({'XL';'L';'M';'S';'M';'L';'XXL'})

查找S中元素“L”对应的布尔值。

code.matlab
>> TI=(S=='L');

用得到的布尔值对S进行索引,筛选出所有的“L”。

code.matlab
>> S(TI)
ans=
  2×1 categorical 数组
     L
     L

【Python】

首先用Categorical函数创建分类数组cat。

code.python
>>> import pandas as pd
>>> cat=pd.Categorical(['XL', 'L', 'M', 'S', 'M', 'L', 'XXL'])

查找cat中元素“M”对应的布尔值。

code.python
>>> id=(cat=="M")

用得到的布尔值对cat进行索引,筛选出所有的“M”。

code.python
>>> cat[id]
['M', 'M']
Categories(5, object): ['S' < 'M' < 'L' < 'XL' < 'XXL']

增加类别

MATLAB和Python都提供了函数向分类数组增加新的类别。注意,添加的是类别,不是分类数组元素。

【MATLAB】

用addcats函数可以向分类数组添加类别,可以添加到类别的末尾,也可以添加到有序分类数组的类别的指定位置。

下面创建一个分类数组A:

code.matlab
>> A=categorical({'大','小','中';'小','大','小'});
>> categories(A)
ans=
    '中'
    '大'
    '小'

用addcats函数在A的类别的末尾添加两个类别。

code.matlab
>> B=addcats(A, {'很大','微小'});
>> categories(B)
ans=
    '中'
    '大'
    '小'
    '很大'
    '微小'

为了演示在指定位置插入类别,先创建一个有序分类数组。在命令窗口中输入:

code.matlab
>> A=categorical({'m' 'l'; 's' 'xl'; 'l' 'm'},{'s' 'm' 'l' 'xl'},'Ordinal',true)
A=
     m      l
     s      xl
     l      m

A是有序分类数组,指定的排序为s < m < l < xl。下面在s类别前添加类别xs。

code.matlab
>> B=addcats(A, 'xs','Before','s');
>> categories(B)
ans=
    'xs'
    's'
    'm'
    'l'
    'xl'

【Python】

用add_categories函数向分类数组类别的末尾添加新的类别。下面创建一个分类数组cat:

code.python
>>> import pandas as pd
>>> cat=pd.Categorical(['大', '小', '中', '小', '大', '小'])
>>> cat.categories
Index(['S', 'M', 'L', 'XL', 'XXL'], dtype='object')
用add_categories函数向分类数组的类别添加两个新的类别。
>>> cat.add_categories(['很大','微小'])
['大', '小', '中', '小', '大', '小']
Categories(5, object): ['中', '大', '小', '很大', '微小']

修改类别

分类数组创建后,可以修改它的类别。

【MATLAB】

用setcats函数可以为分类数组设置新类别。对于下面的分类数组A:

code.matlab
>> A=categorical({'日用品','生鲜','熟食','熟食','日用品','生鲜'});
>> A
A=
  1×6 categorical 数组
     日用品      生鲜      熟食      熟食      日用品      生鲜

重新设置新类别。

code.matlab
>> B=setcats(A, {'日用品','生鲜','粮油'})
B=
  1×6 categorical 数组
  列 16
     日用品      生鲜      <undefined>      <undefined>      日用品      生鲜

原分类数组A中没有新指定类别的元素用<undefined>表示。可以直接赋值,如:

code.matlab
>> B(3)= '粮油';
>> B(4)= '粮油';
>> B
B=
  1×6 categorical 数组
     日用品      生鲜      粮油      粮油      日用品      生鲜

【Python】

Python中用set_categories函数为分类数组设置新类别。对于下面的分类数组cat:

code.python
>>> import pandas as pd
>>> cat=pd.Categorical(['日用品','生鲜','熟食','熟食','日用品','生鲜'])
>>> cat
['日用品', '生鲜', '熟食', '熟食', '日用品', '生鲜']
Categories(3, object): ['日用品', '熟食', '生鲜']

重新设置新类别。

code.python
>>> B=cat.set_categories(['日用品','生鲜','粮油'])
>>> B
['日用品', '生鲜', NaN, NaN, '日用品', '生鲜']
Categories(3, object): ['日用品', '生鲜', '粮油']

原分类数组中没有新指定类别的元素用NaN表示。可以直接赋值,如:

code.python
>> B[2]= '粮油'
>> B[3]= '粮油'
>> B
['日用品', '生鲜', '粮油', '粮油', '日用品', '生鲜']
Categories(3, object): ['日用品', '生鲜', '粮油']

重命名类别

可以对分类数组中的类别重新命名。

【MATLAB】

MATLAB中用renamecats函数对分类数组的类别重新命名。下面创建分类数组S,将类别“XXL”重命名为“VL”。

code.matlab
>> S=categorical({'XL';'L';'M';'S';'M';'L';'XXL'});
>> R=renamecats(S,{'S','M','L','XL','VL'})
R=
  7×1 categorical 数组
     XL
     S
     M
     L
     M
     S
     VL

【Python】

Python中用pandas包的rename_categories函数对分类数组的类别重命名。下面创建分类数组cat,将类别“XXL”重命名为“VL”。

code.python
>>> import pandas as pd
>>> cat=pd.Categorical(['XL', 'L', 'M', 'S', 'M', 'L', 'XXL'])
>>> cat.rename_categories({'XXL': 'VL'})
['XL', 'L', 'M', 'S', 'M', 'L', 'VL']
Categories(5, object): ['L', 'M', 'S', 'XL', 'VL']

删除类别

MATLAB和Python都提供了函数删除分类数组中不用的类别,或删除指定类别。

【MATLAB】

MATLAB用removecats函数删除没使用的类别或指定的类别。

下面的分类数组A定义了3个类别。

code.matlab
>> A=categorical({'red';'blue';'blue';'red';'blue';'red'},{'red','blue';'pink'});
>> categories(A)
ans=
    'red'
    'blue'
    'pink'

A中元素只用到了两个类别,用removecats函数删除没有用到的“pink”类别。

code.matlab
>> B=removecats(A)
ans=
    'red'
    'blue'

也可以指定“pink”类别进行删除。

code.matlab
>> B=removecats(A, 'pink');

【Python】

Python中用pandas包的remove_unused_categories函数删除没使用的类别,用remove_categories函数删除指定的类别。

下面创建一个分类数组cat:

code.python
>>> import pandas as pd
>>> cat=pd.Categorical(['red','blue','blue','red','blue','red'],categories=['red','blue','pink'])

cat中只用到了两个类别,用remove_unused_categories函数删除没有用到的“pink”类别。

code.python
>>> cat.remove_unused_categories()
['red', 'blue', 'blue', 'red', 'blue', 'red']
Categories(2, object): ['red', 'blue']

也可以用remove_categories函数指定“pink”类别进行删除。

code.python
>>> cat.remove_categories('pink')
['red', 'blue', 'blue', 'red', 'blue', 'red']
Categories(2, object): ['blue', 'red']