自定义列_如何对Pandas DataFrame进行自定义排序
![](/assets/blank.gif)
Pandas DataFrame有一个内置方法sort_values(),可以根据给定的变量对值进行排序。该方法本身使用起来相当简单,但是它不适用于自定义排序,例如,
- t恤尺寸:XS、S、M、L和XL
- 月份:一月、二月、三月、四月等
- 星期几:周一、周二、周三、周四、周五、周六和周日。
在本文中,我们将了解如何对Pandas DataFrame进行自定义排序。
问题
假设我们有一个关于服装店的数据集:
df = pd.DataFrame({ 'cloth_id': [1001, 1002, 1003, 1004, 1005, 1006], 'size': ['S', 'XL', 'M', 'XS', 'L', 'S'],})
![](/assets/blank.gif)
我们可以看到,每一块布料都有一个尺寸值,数据应该按以下顺序排序:
- XS代表特大号
- S代表小号
- M代表中号
- L代表大号
- XL为特大号
但是,当调用sort_values('size')时,将得到以下输出。
![](/assets/blank.gif)
输出不是我们想要的,但它在技术上是正确的。实际上,sort_values()是按数字顺序对数值数据排序,对对象数据按字母顺序排序。
以下是两种常见的解决方案:
- 为自定义排序创建新列
- 使用CategoricalDtype将数据强制转换为具有有序性的类别类型
为自定义排序创建新列
在这个解决方案中,需要一个映射数据帧来表示一个自定义排序,然后根据映射创建一个新的列,最后我们可以按新列对数据进行排序。让我们通过一个例子来看看这是如何工作的。
首先,让我们创建一个映射数据帧来表示自定义排序。
df_mapping = pd.DataFrame({ 'size': ['XS', 'S', 'M', 'L', 'XL'],})sort_mapping = df_mapping.reset_index().set_index('size')
![](/assets/blank.gif)
之后,使用sort_mapping中的映射值创建一个新的列 size_num。
df['size_num'] = df['size'].map(sort_mapping['index'])
最后,按新的列大小对值进行排序。
df.sort_values('size_num')
![](/assets/blank.gif)
这当然是我们的工作。但它创建了一个备用列,在处理大型数据集时效率可能会降低。
我们可以使用CategoricalDtype更有效地解决这个问题。
使用CategoricalDtype将数据强制转换为具有有序性的类别类型
CategoricalDtype是具有类别和顺序的分类数据的类型[1]。它对于创建自定义排序非常有用[2]。让我们通过一个例子来看看这是如何工作的。
首先,让我们导入CategoricalDtype。
from pandas.api.types import CategoricalDtype
然后,创建一个自定义类别类型cat_size_order
- 第一个参数设置为['XS'、'S'、'M'、'L'、'XL']作为尺寸的唯一值。
- 第二个参数ordered=True,将此变量视为有序。
cat_size_order = CategoricalDtype( ['XS', 'S', 'M', 'L', 'XL'], ordered=True)
然后,调用astype(cat_size_order)将大小数据强制转换为自定义类别类型。通过运行df['size'],我们可以看到size列已经被转换为一个类别类型,其顺序为[XS
>>> df['size'] = df['size'].astype(cat_size_order)>>> df['size']0 S1 XL2 M3 XS4 L5 SName: size, dtype: categoryCategories (5, object): [XS < S < M < L < XL]
最后,我们可以调用相同的方法对值进行排序。
df.sort_values('size')
![](/assets/blank.gif)
这样效果更好。让我们来看看原理是什么。
使用cat的codes属性访问
现在size列已经被转换为category类型,我们可以使用.cat访问器以查看分类属性。在幕后,它使用codes属性来表示有序变量的大小。
让我们创建一个新的列代码,这样我们可以并排比较大小和代码值。
df['codes'] = df['size'].cat.codesdf
![](/assets/blank.gif)
我们可以看到XS、S、M、L和XL的代码分别为0、1、2、3、4和5。codes是类别实际值。通过运行df.info(),我们可以看到实际上是int8。
>>> df.info()RangeIndex: 6 entries, 0 to 5Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 cloth_id 6 non-null int64 1 size 6 non-null category 2 codes 6 non-null int8 dtypes: category(1), int64(1), int8(1)memory usage: 388.0 bytes
按多个变量排序
接下来,让我们把事情变得更复杂一点。这里,我们将按多个变量对数据帧进行排序。
df = pd.DataFrame({ 'order_id': [1001, 1002, 1003, 1004, 1005, 1006, 1007], 'customer_id': [10, 12, 12, 12, 10, 10, 10], 'month': ['Feb', 'Jan', 'Jan', 'Feb', 'Feb', 'Jan', 'Feb'], 'day_of_week': ['Mon', 'Wed', 'Sun', 'Tue', 'Sat', 'Mon', 'Thu'],})
类似地,让我们创建两个自定义类别类型cat_day_of_week和cat_month,并将它们传递给astype()。
cat_day_of_week = CategoricalDtype( ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], ordered=True)cat_month = CategoricalDtype( ['Jan', 'Feb', 'Mar', 'Apr'], ordered=True,)df['day_of_week'] = df['day_of_week'].astype(cat_day_of_week)df['month'] = df['month'].astype(cat_month)
要按多个变量排序,我们只需要传递一个列表来代替sort_values()。例如,按month和day_of_week排序。
df.sort_values(['month', 'day_of_week'])
![](/assets/blank.gif)
按ustomer_id,month 和day_of_week排序。
df.sort_values(['customer_id', 'month', 'day_of_week'])
![](/assets/blank.gif)
自定义列_如何对Pandas DataFrame进行自定义排序相关推荐
- dataframe 排序_如何对Pandas DataFrame进行自定义排序
作者|B. Chen 编译|VK 来源|Towards Data Science Pandas DataFrame有一个内置方法sort_values(),可以根据给定的变量对值进行排序.该方法本身使 ...
- python dataframe索引转成列_如何将 Pandas DataFrame 的索引转换为列
我们将介绍将 Pandas DataFrame 的索引转换为列的各种方法,例如 df.index,带有 rename_axis 的 reset_index 来重命名索引,以及 set_index. 我 ...
- python交换两列的位置_如何更改 pandas dataframe 中两列的位置
如何更改 pandas dataframe 中两列的位置: 把其中的某列移到第一列的位置. 原来的 df 是: df = pd.read_csv('I:/Papers/consumer/codeand ...
- python怎么画参数函数图像_详解pandas.DataFrame.plot() 画图函数
首先看官网的DataFrame.plot( )函数 DataFrame.plot(x=None, y=None, kind='line', ax=None, subplots=False, share ...
- iview table 自定义列_基于VueJS的render渲染函数打造一款非常强大的IView 的Table组件...
1.render渲染函数的介绍 字符串模板的代替方案,允许你发挥 JavaScript 最大的编程能力.该渲染函数接收一个 createElement 方法作为第一个参数用来创建 VNode. 如果组 ...
- dataframe如何替换某列元素值,python – Pandas DataFrame,用另一列的值替换列的值
我的boosting_df Pandas DataFrame如下: sku boost1 boost2 boost3 boost4 0 a ffffdfg a fggg replace 1 b fff ...
- python0不能做除数、怎么解决_浅谈pandas dataframe对除数是零的处理
如下例 data2['营业成本率'] = data2['营业成本本年累计']/data2['营业收入本年累计']*100 但有营业收入本年累计为0的情况, 则营业成本率为inf,即无穷大,而需要在表中 ...
- pandas 取excel 中的某一列_干货Python Pandas 做数据分析之玩转 Excel 报表分析
本篇文章选自作者在 GitChat 的分享,若有什么问题,可在公众号回复「小助手」添加小助手微信,邀请你进入技术交流群. 各位朋友大家好,非常荣幸和大家聊一聊用 Python Pandas 处理 Ex ...
- pandas打印某一列_一场Pandas与SQL的巅峰大战
作为一名数据分析师,平常用的最多的工具是SQL(包括MySQL和Hive SQL等).对于存储在数据库中的数据,自然用SQL提取会比较方便,但有时我们会处理一些文本数据(txt,csv),这个时候就不 ...
最新文章
- 加速键使用方法详解(示例)
- 九大排序算法,你会几个?
- c++primer 5th习题12.25答案
- Android插件化开发基础之Java反射机制研究
- JAVA设置新视口,java – 在更大的图像上移动视口; JLablel JScrollPane
- 作为一名前端开发工程师,你必须掌握的WEB模板引擎:Handlebars
- Python小白的数学建模课-05.0-1规划
- mysql简单常用语句汇总
- 禅道程序员的10条原则--转载--为了不忘
- java获取inputstream_Java:我怎样才能从inputStream获取编码?
- 移动目录下的隐藏文件
- 世界七大数学难题与Hilbert的23个问题
- batchplot插件用法_batchplot批量打印怎么用?Batchplot(CAD批量打印工具)安装步骤
- 自抗扰控制器七-二阶 LADRC-PLL 结构设计
- ABB ACS 510 1.5-5.5kw驱动板图纸 PDF格式
- 运维工程师具备的基本技能
- vue-cli从2升级到3报错error 404 Not Found: @wry/context@^0.4.0
- 响应式原理(Vue2.x)下篇
- 《崩坏3》评测:游戏设计中整体性和利用率分析(中)
- JAVA子类作为实参父类作为形参_java 多态 实参形参
热门文章
- oracle数据库存储管理总结,oracle数据库存储管理
- java移动元素_如何通过箭头键连续/平滑地移动元素?
- 单击托盘显示菜单mfc_PhotoShop制作滚动菜单栏教程
- arduino uno电压_Arduino UNO中文数据手册
- python爬虫定时运行_python 每天如何定时启动爬虫任务
- 数据库中复合主键与联合主键
- 服务器系统盘单独硬盘,我的服务器今天加了个硬盘,可以实现双系统吗?
- 【Spark Summit EU 2016】沃森媒体分析系统:从单租户Hadoop到3000租户Spark的架构演进...
- Ansible8:Playbook循环【转】
- Struts与Struts2的区别