查看原文
其他

Python:Pandas的DataFrame如何按指定list排序

LEMON Python数据之道 2022-04-24

前言

写这篇文章的起由是有一天微信上一位朋友问到一个问题,问题大体意思概述如下:

现在有一个pandas的Series和一个python的list,想让Series按指定的list进行排序,如何实现?

这个问题的需求用流程图描述如下:

我思考了一下,这个问题解决的核心是引入pandas的数据类型“category”,从而进行排序。

在具体的分析过程中,先将pandas的Series转换成为DataFrame,然后设置数据类型,再进行排序。思路用流程图表示如下:

分析过程

  • 引入pandas库

  1. import pandas as pd

  • 构造Series数据

  1. s = pd.Series({'a':1,'b':2,'c':3})

  2. s

  1. a    1

  2. b    2

  3. c    3

  4. dtype: int64

  1. s.index

  1. Index(['a', 'b', 'c'], dtype='object')

  • 指定的list,后续按指定list的元素顺序进行排序

  1. list_custom = ['b', 'a', 'c']

  2. list_custom

  1. ['b', 'a', 'c']

  • 将Series转换成DataFrame

  1. df = pd.DataFrame(s)

  2. df = df.reset_index()

  3. df.columns = ['words', 'number']

  4. df


wordsnumber
0a1
1b2
2c3

设置成“category”数据类型

  1. # 设置成“category”数据类型

  2. df['words'] = df['words'].astype('category')

  1. # inplace = True,使 recorder_categories生效

  2. df['words'].cat.reorder_categories(list_custom, inplace=True)

  3. # inplace = True,使 df生效

  4. df.sort_values('words', inplace=True)

  5. df


wordsnumber
1b2
0a1
2c3

指定list元素多的情况:

若指定的list所包含元素比Dataframe中需要排序的列的元素,怎么办?

  • reorder_catgories()方法不能继续使用,因为该方法使用时要求新的categories和dataframe中的categories的元素个数和内容必须一致,只是顺序不同。

  • 这种情况下,可以使用 set_categories()方法来实现。新的list可以比dataframe中元素多。

  1. list_custom_new = ['d', 'c', 'b','a','e']

  2. dict_new = {'e':1, 'b':2, 'c':3}

  3. df_new = pd.DataFrame(list(dict_new.items()), columns=['words', 'value'])

  4. print(list_custom_new)

  5. df_new.sort_values('words', inplace=True)

  6. df_new

  1. ['d', 'c', 'b', 'a', 'e']


wordsvalue
0b2
1c3
2e1
  1. df_new['words'] = df_new['words'].astype('category')

  2. # inplace = True,使 set_categories生效

  3. df_new['words'].cat.set_categories(list_custom_new, inplace=True)

  4. df_new.sort_values('words', ascending=True)


wordsvalue
1c3
0b2
2e1

指定list元素少的情况:

若指定的list所包含元素比Dataframe中需要排序的列的元素,怎么办?

  • 这种情况下,set_categories()方法还是可以使用的,只是没有的元素会以NaN表示

注意下面的list中没有元素“b”

  1. list_custom_new = ['d', 'c','a','e']

  2. dict_new = {'e':1, 'b':2, 'c':3}

  3. df_new = pd.DataFrame(list(dict_new.items()), columns=['words', 'value'])

  4. print(list_custom_new)

  5. df_new.sort_values('words', inplace=True)

  6. df_new

  1. ['d', 'c', 'a', 'e']


wordsvalue
0b2
1c3
2e1
  1. df_new['words'] = df_new['words'].astype('category')

  2. # inplace = True,使 set_categories生效

  3. df_new['words'].cat.set_categories(list_custom_new, inplace=True)

  4. df_new.sort_values('words', ascending=True)


wordsvalue
0NaN2
1c3
2e1

总结

根据指定的list所包含元素比Dataframe中需要排序的列的元素的多或少,可以分为三种情况:

  • 相等的情况下,可以使用 reorder_categories和 set_categories方法;

  • list的元素比较多的情况下, 可以使用set_categories方法;

  • list的元素比较少的情况下, 也可以使用set_categories方法,但list中没有的元素会在DataFrame中以NaN表示。


源代码

需要的童鞋可在微信公众号“Python数据之道”(ID:PyDataRoad)后台回复关键字获取视频,关键字如下:

2017025”(不含引号)


更多精彩文章

请点击微信公众号底部菜单栏。


文章集锦:

Pandas

python求职Top10城市,来看看是否有你所在的城市

用Pandas获取商品期货价格并可视化

Pandas日期数据处理:如何按日期筛选、显示及统计数据

UFO长啥样?

Pandas分组运算(groupby)修炼


可视化

Pycon 2017: Python可视化库大全

Python可视化:Seaborn库热力图使用进阶

关于matplotlib,你要的饼图在这里


项目实战

python求职Top10城市,来看看是否有你所在的城市

5分钟掌握智联招聘网站爬取并保存到MongoDB数据库

特朗普退出《巴黎协定》:python词云图舆情分析

用词云图分析一带一路峰会哪3个词说的最多

50年高考作文题,记录时代变迁

用Pandas获取商品期货价格并可视化

UFO长啥样?


其他

Anaconda安装第三方包(whl文件)

为什么你用不好Numpy的random函数?

python3.6下安装结巴分词需要注意的地方

python3下安装aiohttp遇到过的那些坑



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存