pandas中category类型的数据

  • 用途和特点
    • 常见的问题处理
    • Categorical 数据

用途和特点

category是pandas中定义的一个数据类型,相当于R中的因子。可以对特点的类型数据进行按照自己的意愿进行排序,特别是我们在处理数据是需要对字符串进行排序时,有时候默认的顺序真的很无奈。这个时候就是这个类型该入场的时候了。下面我们看下这个类型的具体使用情况。

常见的问题处理

在日常数据处理中使用pd.cut或pd.qcut时,默认分组标签就是category类型,不知道你处理时是否头疼过。不过这个确实给我们想向里面加数据时带来了麻烦,例如以下情况:

import numpy as np
import pandas as pd
lst=[np.nan,np.nan]
lst.extend(range(1,100))
data=pd.DataFrame({'A':lst ,'B':np.random.randn(101)})
#想把缺失值分成一个组,先不处理缺失值
data['group']=pd.cut(data['A'],10)
#分组后填充缺失值data['group'].fillna('空缺')

这样就会报如下错误:

当然了这里你可以把分组标签转成字符串处理,但是会出现排序不理想的情况。这里可以这样完美解决。

import numpy as np
import pandas as pd
lst=[np.nan,np.nan]
lst.extend(range(1,100))
data=pd.DataFrame({'A':lst ,'B':np.random.randn(101)})
#想把缺失值分成一个组,先不处理缺失值
data['group']=pd.cut(data['A'],10)
#分组后填充缺失值
data['group']=data['group'].cat.add_categories(['空缺'])
data['group'].fillna('空缺')

这个是为什么?不要急下面就说原因。

Categorical 数据

这里可以参考文档:pandas文档
上面已经说了,categorical类型是pandas中定义的一个变量。
1、Series的创建
可以通过几种方式创建类别中的类别Series或列DataFrame:
通过指定dtype="category"在构造时Series:

s = pd.Series(["a", "b", "c", "a"],dtype="category")
s

输出:

通过将现有的Series或列转换为categorydtype:

In [3]: df = pd.DataFrame({"A": ["a", "b", "c", "a"]})In [4]: df["B"] = df["A"].astype('category')In [5]: df
Out[5]: A  B
0  a  a
1  b  b
2  c  c
3  a  a

通过使用特殊功能(例如)cut(),可以将数据分组为离散的bin。请参阅文档中有关的示例。

In [6]: df = pd.DataFrame({'value': np.random.randint(0, 100, 20)})In [7]: labels = ["{0} - {1}".format(i, i + 9) for i in range(0, 100, 10)]In [8]: df['group'] = pd.cut(df.value, range(0, 105, 10), right=False, labels=labels)In [9]: df.head(10)
Out[9]: value    group
0     65  60 - 69
1     49  40 - 49
2     56  50 - 59
3     43  40 - 49
4     43  40 - 49
5     91  90 - 99
6     32  30 - 39
7     87  80 - 89
8     36  30 - 39
9      8    0 - 9

通过将pandas.Categorical对象传递给Series或将其分配给DataFrame。

In [10]: raw_cat = pd.Categorical(["a", "b", "c", "a"], categories=["b", "c", "d"],....:                          ordered=False)....: In [11]: s = pd.Series(raw_cat)In [12]: s
Out[12]:
0    NaN
1      b
2      c
3    NaN
dtype: category
Categories (3, object): [b, c, d]In [13]: df = pd.DataFrame({"A": ["a", "b", "c", "a"]})In [14]: df["B"] = raw_catIn [15]: df
Out[15]: A    B
0  a  NaN
1  b    b
2  c    c
3  a  NaN

2、DataFrame 创建
可以在创建时dataframe时,定义

In [17]: df = pd.DataFrame({'A': list('abca'), 'B': list('bccd')}, dtype="category")In [18]: df.dtypes
Out[18]:
A    category
B    category
dtype: object

3、控制category
通过上面的例子可能已经对这个类型有所了解了。下面我们看下它的强大之处。

from pandas.api.types import CategoricalDtype
s = pd.Series(["a", "b", "c", "a","d","e"])
cat_type = CategoricalDtype(categories=["b", "c", "a"],ordered=True)#categories必须是一个列表
s_cat = s.astype(cat_type)
s_cat

输出:

这里,我们定义一个Categorical类型数据,没有定义在列表的值被置成了NaN值。我们再看下结果中[b < c < a],这个排序和python默认序列已经不一样了。

Categorical类型数据我们定义后,是一个固定的列表了,我们不能直接添加没有定义的类别。这里就需要对类型数据进行操作了。

3、类型数据的基本操作
分类数据具有类别和有序属性,它们列出了它们的可能值以及排序是否重要。这些属性在s.cat.categories和中公开s.cat.ordered。如果您不手动指定类别和顺序,则可以从传递的参数中推断出它们。

In [57]: s = pd.Series(["a", "b", "c", "a"], dtype="category")In [58]: s.cat.categories
Out[58]: Index(['a', 'b', 'c'], dtype='object')In [59]: s.cat.ordered
Out[59]: False

也可以按特定顺序传递类别:

In [60]: s = pd.Series(pd.Categorical(["a", "b", "c", "a"],....:               categories=["c", "b", "a"]))....: In [61]: s.cat.categories
Out[61]: Index(['c', 'b', 'a'], dtype='object')In [62]: s.cat.ordered
Out[62]: False

这里注意:新的分类数据不会自动排序。您必须明确传递ordered=True以指示已定义的Categorical

4、重命名

In [67]: s = pd.Series(["a", "b", "c", "a"], dtype="category")In [68]: s
Out[68]:
0    a
1    b
2    c
3    a
dtype: category
Categories (3, object): [a, b, c]In [69]: s.cat.categories = ["Group %s" % g for g in s.cat.categories]In [70]: s
Out[70]:
0    Group a
1    Group b
2    Group c
3    Group a
dtype: category
Categories (3, object): [Group a, Group b, Group c]In [71]: s = s.cat.rename_categories([1, 2, 3])In [72]: s
Out[72]:
0    1
1    2
2    3
3    1
dtype: category
Categories (3, int64): [1, 2, 3]# You can also pass a dict-like object to map the renaming
In [73]: s = s.cat.rename_categories({1: 'x', 2: 'y', 3: 'z'})In [74]: s
Out[74]:
0    x
1    y
2    z
3    x
dtype: category
Categories (3, object): [x, y, z]

请注意,分配新类别是一个就地操作,而Series.cat默认情况下,大多数其他操作将返回一个新Series的dtype category。

这里类别必须是唯一和非NaN值,否知会报错

In [75]: try:....:     s.cat.categories = [1, 1, 1]....: except ValueError as e:....:     print("ValueError:", str(e))....:
ValueError: Categorical categories must be unique
In [76]: try:....:     s.cat.categories = [1, 2, np.nan]....: except ValueError as e:....:     print("ValueError:", str(e))....:
ValueError: Categorial categories cannot be null

5、追加新的类别
可以使用以下.cat.add_categories()方法完成附加类别 :

In [77]: s = s.cat.add_categories([4])In [78]: s.cat.categories
Out[78]: Index(['x', 'y', 'z', 4], dtype='object')In [79]: s
Out[79]:
0    x
1    y
2    z
3    x
dtype: category
Categories (4, object): [x, y, z, 4]

6、删除类别
删除类别可以通过使用.cat.remove_categories()方法来完成 。删除的值将替换为np.nan。

In [80]: s = s.cat.remove_categories([4])In [81]: s
Out[81]:
0    x
1    y
2    z
3    x
dtype: category
Categories (3, object): [x, y, z]

7、删除未使用的类别

In [82]: s = pd.Series(pd.Categorical(["a", "b", "a"],....:               categories=["a", "b", "c", "d"]))....: In [83]: s
Out[83]:
0    a
1    b
2    a
dtype: category
Categories (4, object): [a, b, c, d]In [84]: s.cat.remove_unused_categories()
Out[84]:
0    a
1    b
2    a
dtype: category
Categories (2, object): [a, b]

8、设置类别

一步一步的删除和添加新类别,相对比较麻烦,可以使用.cat.set_categories来设置。

In [85]: s = pd.Series(["one", "two", "four", "-"], dtype="category")In [86]: s
Out[86]:
0     one
1     two
2    four
3       -
dtype: category
Categories (4, object): [-, four, one, two]In [87]: s = s.cat.set_categories(["one", "two", "three", "four"])In [88]: s
Out[88]:
0     one
1     two
2    four
3     NaN
dtype: category
Categories (4, object): [one, two, three, four]```9、排序和顺序```python
In [89]: s = pd.Series(pd.Categorical(["a", "b", "c", "a"], ordered=False))In [90]: s.sort_values(inplace=True)In [91]: s = pd.Series(["a", "b", "c", "a"]).astype(....:     CategoricalDtype(ordered=True)....: )....: In [92]: s.sort_values(inplace=True)In [93]: s
Out[93]:
0    a
3    a
1    b
2    c
dtype: category
Categories (3, object): [a < b < c]In [94]: s.min(), s.max()
Out[94]: ('a', 'c')

或者使用.cat.as_ordered()排序

In [95]: s.cat.as_ordered()
Out[95]:
0    a
3    a
1    b
2    c
dtype: category
Categories (3, object): [a < b < c]In [96]: s.cat.as_unordered()
Out[96]:
0    a
3    a
1    b
2    c
dtype: category
Categories (3, object): [a, b, c]```这些基本上够用的了,想了解更深的可以查看[官网资料](https://pandas.pydata.org/pandas-docs/stable/user_guide/categorical.html)。

pandas中category类型的数据处理相关推荐

  1. python查看dataframe数据类型_python pandas中DataFrame类型数据操作函数的方法

    python数据分析工具pandas中DataFrame和Series作为主要的数据结构. 本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数. 1)查看DataFrame数 ...

  2. python dataframe函数_python pandas中DataFrame类型数据操作函数的方法

    这篇文章主要介绍了关于python pandas中DataFrame类型数据操作函数的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 python数据分析工具pandas中Data ...

  3. Python—pandas中DataFrame类型数据操作函数

    python数据分析工具pandas中DataFrame和Series作为主要的数据结构.  本文主要是介绍如何对DataFrame数据进行操作并结合一个实例测试操作函数.  1)查看DataFram ...

  4. python 处理xml pandas_Python数据处理分析,解决pandas中所有的Excel疑难杂症(上)

    发现许多小伙伴入门Python几个月,还是低效率做数据处理.这套课程以形象的示意图,精心安排的案例,循序渐进带你玩转数据处理分析神器--pandas,课程中还有分析案例噢,干货满满! 前言 经过前2个 ...

  5. Pandas 中的这 3 个函数,没想到竟成了我数据处理的主力

    作者 | luanhz   责编 | 张文 来源 | 转载自公众号小数志 学 Pandas 有一年多了,用 Pandas 做数据分析也快一年了,常常在总结梳理一些 Pandas 中好用的方法.例如三个 ...

  6. [转载] 整理总结 python 中时间日期类数据处理与类型转换(含 pandas)

    参考链接: Python中的时间函数 2(日期操作) 我自学 python 编程并付诸实战,迄今三个月. pandas可能是我最高频使用的库,基于它的易学.实用,我也非常建议朋友们去尝试它.--尤其当 ...

  7. pandas 转换为文本类型_Pandas对文本数据处理

    在处理数据的时候对数值型的数据处理还是比较方便的但是有时候数值型数据出现问题后就会比较头痛了因为文本数据的排列组合可是有很多很多的今天我们就学习一下如何对文本数据进行处理这样我们接下来在工作中遇到了这 ...

  8. Pandas中的这3个函数,没想到竟成了我数据处理的主力

    公众号后台回复"图书",了解更多号主新书内容 作者:luanhz 来源:小数志 学Pandas有一年多了,用Pandas做数据分析也快一年了,常常在总结梳理一些Pandas中好用的 ...

  9. Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介、具体案例、使用方法之详细攻略

    Python之pandas:pandas中数据处理常用函数(与空值相关/去重和替代)简介.具体案例.使用方法之详细攻略 目录 pandas中数据处理常用函数(isnull/dropna/fillna/ ...

  10. AOSP6.0.1 系统中增加新的category类型与app绑定,并在hotseat容器中加载app

    在launcher3(桌面程序)的hotseat中,可以通过修改dw_phone_hotseat.xml在指定位置加载指定app(仅限于已经指定category类型为APP_xxxx的app或者是系统 ...

最新文章

  1. 76.Zabbix添加图形和聚合图形
  2. cordova打包app后发请求出现 Provisional headers are shown的问题
  3. 02331 数据结构 学习小记 归纳总结
  4. 链表中倒数第 k 个节点
  5. Android小知识-单例引起的内存泄漏
  6. cp 时间长 linux,为了节省cp命令时间,结果换来了重装linux系统的差事
  7. pageControl设置不居中显示,居左或居右
  8. 手机网页form表单样式_超全面!13种表单样式的设计方式都在这了
  9. JavaScript经纬度和地图坐标相互转换
  10. 识图在线识图_以图搜图在线搜索软件
  11. LINUX 安装护眼软件
  12. 【阅读笔记】Mutual CRF-GNN for Few-shot Learning
  13. C语言爱心代码大全集—会Ctrl+C就可以表白了
  14. DWcs4右下角没有html文件,dreamweaver cs4 (dwcs4)安装图文教程
  15. 如何实现vue表单验证cron表达式?【亲测有效】
  16. Hadoop3.x集群搭建及配置的完整操作流程
  17. TDengine学习笔记
  18. HDLC广域网协议设置
  19. ios nslog 例子_iOS Runtime常用示例总结
  20. swift python混合开发_引用swift项目

热门文章

  1. salt returner mysql_saltstack实战2--远程执行之返回(returner)
  2. SpringAOP基础以及四种实现方式
  3. Foxmail中Exchange设置账户总是提示密码错误
  4. Python脚本系列:拳皇13一键出招以及连段实现!谁打得过我?
  5. 华东理工c语言题库,华东理工大学c语言.doc
  6. 我花了20年研究华为,发现了这些秘密……
  7. Linux怎么去掉secondary地址,有关IP aliasing, Primary address和Secondary address
  8. leetcode + 腾讯面试
  9. 对待新知识、新领域的心态——好奇、批判、独孤求败
  10. cocos2dx 制作一个简单的三消游戏