Pandas 实用技能,将列(column)排序的几种方法

news/2024/7/7 18:54:55

60ecb392c2ca410eac100d5947d87281.gif

作者 | 阳哥

来源 | Python数据之道

Pandas 可以说是 在Python数据科学领域应用最为广泛的工具之一。

Pandas是一种高效的数据处理库,它以 dataframeseries 为基本数据类型,呈现出类似excel的二维数据。

在数据处理过程中,咱们经常需要将列按照一定的要求进行排序,以方便展示。

这里,给大家分享下 在 Pandas 中将列排序的几种常用方法。

数据准备

文中主要使用了 pandasakshare ,首先导入 Python 库,如下:

import pandas as pd
import akshare as akprint(f'pandas version: {pd.__version__}')

本次使用的数据如下:

data = {'brand':['Python数据之道','价值前瞻','菜鸟数据之道','Python','Java'],'B':[4,6,8,12,10],'A':[10,2,5,20,16],'D':[6,18,14,6,12],'years':[4,1,1,30,30],'C':[8,12,18,8,2],
}df = pd.DataFrame(data=data)
df

7a120b640f64e8a2ec0d95b364a35f2c.png

现将现有的 columns 输出,方便后面 copy 使用。

df.columns# Index(['brand', 'B', 'A', 'D', 'years', 'C'], dtype='object')

Method 1

第一种方法,也是我自己常用的方法,就是自己将列的名称按需要进行手动排序,然后运行代码如下:

508c9a1e44af41bdd7e1de1d5136e145.png

Method 2

第二种方法,是使用 .iloc 方法,通过列的位置来进行排序,如下:

0947c6a4e7373f914538395b47d3f85e.png

Method 3

第三种方法,是使用 .loc 方法,通过列的名称来进行排序,如下:

26a142963269dccf3ee02640dfabc110.png

这种方法跟第一种方法类似,个人觉得第一种方法更简洁些。

Method 4

第四种是 逆序 排序,算是排序中一种特定的排序方式。

# Method 4 ,逆序cols = list(df.columns)cols.reverse()df[cols]

上述代码中,cols.reverse() 是将列表(list)进行逆序排序。

此外,列表(list)的逆序排序,还可以用 cols[::-1] 来实现。因此,下面的方法也可以实现逆序排序。

# Method 4 ,逆序cols = list(df.columns)df[cols[::-1]]

0c2fcfcfdf5fa957b550a12db893f92a.png

实战案例:自由排序

有时候,当存在变量、列的数量较多,或者不同的dataframe中列的名称不完全一致等情况出现时,咱们不一定会通过列名称来实现排序。

这里分享一个实战案例,是关于制作基金的十大持仓数据表的,具体过程我就不在这里描述了,下面给出实现的函数,有兴趣的同学可以研究下。

自定义函数如下:

# 需要安装 akshare
# pip install akshareyears = ['2019','2020','2021']def fund_stock_holding(years,code):data = pd.DataFrame()for yr in years:df_tmp = ak.fund_em_portfolio_hold(code=code,year=yr)data = data.append(df_tmp)data['季度']=data['季度'].apply(lambda x:x[:8])data['占净值比例'] = pd.to_numeric(data['占净值比例'])data = data.sort_values(['季度','持仓市值'],ascending=[True,False])df = data.set_index(['序号','季度']).stack().unstack([1,2]).head(10)df = df.loc[:,(slice(None), '股票名称')]df = df.droplevel(None,axis=1)df.columns.name=Nonedf = df.reset_index()
#     df.index.name = Nonedf['基金代码'] = codereturn dfdf = fund_stock_holding(years,'005669')
df

得到的数据表格如下:

ad00a57248cc62665f3833ced80917bf.png

上面的表格中,我需要将 基金代码 这一列移动到 序号 这列的后面,由于 years = ['2019','2020','2021'] 这是一个变量,当具体的值不同时,会导致列名称不一样,因此,在这种情况下我们不能直接使用列的具体名称,但咱们可以通过 列的位置组合来实现,列的调整具体如下:

cols = df.columns.tolist()cols = cols[:1] + cols[-1:] + cols[1:-1]  # 将基金代码列名放前面df = df[cols]

将上面的调整过程整合到自定义函数中,完整的代码如下:

# 需要安装 akshare
# pip install akshareyears = ['2019','2020','2021']def fund_stock_holding_update(years,code):data = pd.DataFrame()for yr in years:df_tmp = ak.fund_em_portfolio_hold(code=code,year=yr)data = data.append(df_tmp)data['季度']=data['季度'].apply(lambda x:x[:8])data['占净值比例'] = pd.to_numeric(data['占净值比例'])data = data.sort_values(['季度','持仓市值'],ascending=[True,False])df = data.set_index(['序号','季度']).stack().unstack([1,2]).head(10)df = df.loc[:,(slice(None), '股票名称')]df = df.droplevel(None,axis=1)df.columns.name=Nonedf = df.reset_index()
#     df.index.name = Nonedf['基金代码'] = codecols = df.columns.tolist()cols = cols[:1] + cols[-1:] + cols[1:-1]  # 将基金代码列名放前面df = df[cols]return dfdf = fund_stock_holding_update(years,'005669')
df

效果如下:

a1a712bdf58e9744cf937c280163b509.png

当然,我最后实现的效果是将基金代码换成基金名称,这个可以想办法实现,效果如下:

9b7746821f7a7869fce9f38c2aef0b2a.png

小结

以上就是关于 Pandas 中 列名称排序的介绍,看似很简单的内容,在最后的实践中,也还是有些小技巧的。

欢迎大家来畅聊,Pandas 中有哪些实用的小技巧~~

cccf79ac32c7241abba93b3400b74646.gif

往期回顾

介绍Pandas实战中的一些高端玩法

用Python+Excel制作一个视频下载器~

Pandas表格样式设置指南,爆赞!

如何用一行Python代码制作一个GUI?

分享
点收藏
点点赞
点在看

http://lihuaxi.xjx100.cn/news/254275.html

相关文章

Numpy入门教程:06. 排序,搜索和计数

背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python。其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执行各种数学任务,如:数值积分、微分、…

设置列表字段为主键

转贴:Sample event handler to set a field as a pr imary key (enforce no duplicates) Got this as a request from a reader- how to prevent users from adding items with same titles as ones that already exist in the list. Codeusing System;using System.Collectio…

Largest Rectangle in a Histogram

ps&#xff1a;单调栈&#xff0c;注意红色部分的代码。 int n;stack<P> s;inline void upd(LL &x, LL y) { (x < y) && (x y); }int main() {while(sc(n) ! EOF && n) {while(!s.empty()) s.pop();LL ans 0;Rep(i, 1, n) {int x;sc(x);if (s.e…

AI大神LeCun深度学习公开课来啦!4万字干货笔记

Datawhale干货 主讲&#xff1a;Yann LeCun&#xff0c;整理&#xff1a;新智元【新智元导读】Yann LeCun大师课程&#xff0c;搭配120页笔记食用效果更佳。喜欢深度学习&#xff1f;最好的方法就是在线课程。这里推荐图灵奖得主、纽约大学教授Yann LeCun主讲的在线课程。该课程…

云淘金时代,安全为王

在数字经济和技术生态高质量发展的今天&#xff0c;企业对前沿技术和高质量人才的需求不断升级。为了帮助更多开发者、企业洞察行业趋势、技术热点&#xff0c;CSDN 重磅打造技术访谈金牌栏目《架构师说》&#xff0c;聚焦数字化转型、云原生、数据库、开源技术、人工智能、出海…

Nginx 面试 40 连问,快顶不住了~~

欢迎关注方志朋的博客&#xff0c;回复”666“获面试宝典什么是Nginx&#xff1f;Nginx是一个 轻量级/高性能的反向代理Web服务器&#xff0c;用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。他实现非常高效的反向代理、负载平衡&#xff0c;他可以处理2-3万并发连接数&#xff0…

学好计算机第一步

Datawhale干货 作者&#xff1a;cxuan审校&#xff1a;黄元帅前 言计算机已经发展了半个世纪之久&#xff0c;我们从一出生就能享用计算机高速发展的成果&#xff0c;但我们从未对计算机产生过敬畏之心&#xff0c;为什么&#xff1f;因为我们不了解计算机&#xff0c;何谈敬畏…

linux tar的使用方法

tar [-cxtzjvfpPN] 文件与目录 ....参数&#xff1a;-c &#xff1a;建立一个压缩文件的参数指令(create 的意思)&#xff1b;-x &#xff1a;解开一个压缩文件的参数指令&#xff01;-t &#xff1a;查看 tarfile 里面的文件&#xff01;特别注意&#xff0c;在参数的下达中&a…