💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ***** 分类数据对应的是统计学中的分类变量:拥有一些有限的值。比如说性别,类型等等。 分类的数据可以有序列性属性,但是不支持数值类型的操作。 常用的场景如下: 1. 将一个只拥不是很多值的字符串变量转换成分类变量可以节省内存 2. 分类变量可以让数据有逻辑排序而不是词汇(词典)的排序,比如 One/two/three。词汇排序,按首字母排序 3. 和其它Python库交互时,它会被当做分类变量处理 ### 1.6.1. 创建分类特征 **Series的创建** ``` import pandas as pd # 设定dtype为category s = pd.Series(["a", "b", "c", "a"], dtype="category") ``` 分类数据显示共有多少种值,重复的不显示 ![](https://img.kancloud.cn/26/75/2675dc7ced57a9086cce57906bfe8827_368x135.png) ***** ``` # 转换已有的数据类型 将A列字符串类型转换为分类数据类型 df = pd.DataFrame({"A": ["a", "b", "c", "a"]}) #将结果保存在dataframe的B列中 df["B"] = df["A"].astype('category') ``` ![](https://img.kancloud.cn/30/5e/305ec1275e40412dfd08fdfb920689d0_311x133.png) ***** ``` # 通过pandas.Categorical 对象进行创建 指定b c d是分类数据,同时它们有序,顺序是categories列表顺序, b<c<d raw_cat = pd.Categorical(["a", "b", "c", "a"], categories=["b", "c", "d"],ordered=True) #变为series s = pd.Series(raw_cat) ``` 创建结果,d在raw_cat中没有出现,但d也被定义为分类数据,共有三个分类数据 ![](https://img.kancloud.cn/b4/49/b44975d31097552d6823c353ee9fac38_382x281.png) ***** 将分类数据变为dataFrame的一个列 ![](https://img.kancloud.cn/44/75/4475515462f9f8c9d522b98cc03b9dfa_467x305.png) ***** **DataFrame的创建** 和之前series创建类似,不过dataframe中可以批量的将列转换格式 ``` #将df_cat的两列都转换为category类型 ``` ![](https://img.kancloud.cn/58/72/58720beeb94988e111175825eeffd030_731x367.png) ***** ![](https://img.kancloud.cn/8e/c0/8ec09c34ded969ec69209c8b74408b40_289x226.png) ``` #collage列转换为category类型 df['collage'] = df['collage'].astype("category") ``` ![](https://img.kancloud.cn/0d/76/0d76287de989c938bca641d2111cae58_1288x283.png) ### 1.6.2. 控制分类值行为:CategoricalDtype "category"默认了分类值的行为: * 类别从数据中继续进行推断 * 没有排序的性质 ``` from pandas.api.types import CategoricalDtype s = pd.Series(['a','b','b','c','d']) ``` ![](https://img.kancloud.cn/86/03/8603fe3e9ef8113ceeacabfbed61bafe_162x175.png) ``` cat_type = CategoricalDtype(categories=['b','c','d'],ordered=True) s.astype(cat_type) ``` ![](https://img.kancloud.cn/f7/e6/f7e6e1bad38b0f56e8335bb517702b12_366x151.png) 一个分类的类别描述如下: * categories:一个唯一值的序列并且没有缺失值 * ordered: 是否排序,布尔类型 ``` CategoricalDtype(categories=['b','c','d'],ordered=True) ``` ### 1.6.3. 分类值的描述 ``` df['collage'].describe() ``` ![](https://img.kancloud.cn/a5/d6/a5d6e214262c0882eb85d33ae815bcf2_324x124.png) ### 1.6.4. 处理分类变量 分类数据拥有分类与排序的特征:包含了分类值展示以及值之间是否是有序的。我们可以通过 s.cat.categories 与 s.cat.ordered 进行操作。如果你没有人为的设定类别与排序信息,它们会被自动推断 **展示所有的分类值** ![](https://img.kancloud.cn/a7/89/a7893d90306d1fa8d26b760c681a99a0_649x294.png) **是否有序** ![](https://img.kancloud.cn/37/03/3703c0caa117c7572253e7182b47b85d_508x177.png) **categories 和 方法 unique()返回的值是不一样的** ![](https://img.kancloud.cn/7a/71/7a717c55ca8b51ea22f381680f902974_634x227.png) ***** 显示series分类值 ![](https://img.kancloud.cn/f4/90/f490ae44cb3155d3f54e273542831219_409x78.png) ***** 显示series唯一值 ![](https://img.kancloud.cn/05/56/0556ef00056110b50ae69c3120e3c26a_351x91.png) ***** ![](https://img.kancloud.cn/76/01/7601d0559f966435a92893ac7d4136a5_396x242.png) ***** ![](https://img.kancloud.cn/9a/57/9a57ff666d5cb8d41e5d31db193fe370_393x240.png) ***** series中没有分类变量d ![](https://img.kancloud.cn/54/1c/541cba994b7fd1feb291c71343eb0dca_359x201.png) ***** ![](https://img.kancloud.cn/ff/c8/ffc81962d03621aecfc4908d68107e4c_395x197.png) #### 1.6.4.1. 排序 ``` cat_type = CategoricalDtype(categories=['one','two','three'],ordered=True) s = pd.Series(['one','three','one','two']) #将series变为分类类型 s = s.astype(cat_type) ``` ![](https://img.kancloud.cn/d6/d3/d6d370f429105fb988674cf37bd0c18d_406x136.png) ***** 可以得到分类变量的顺序的最大最小值 ![](https://img.kancloud.cn/76/19/76197c9534161391d329c656003ddc3c_160x166.png)