当前位置: 首页 > news >正文

模块四-数据转换与操作——20. 数据排序

20. 数据排序

1. 概述

数据排序是数据分析中的基本操作,用于按特定列的值对数据进行升序或降序排列。Pandas 提供了sort_values()sort_index()两种排序方法。

importpandasaspdimportnumpyasnp# 创建示例数据np.random.seed(42)df=pd.DataFrame({'姓名':['张三','李四','王五','赵六','钱七','孙八','周九','吴十'],'部门':['技术','销售','技术','市场','销售','技术','市场','销售'],'工资':[8000,12000,10000,15000,11000,9500,10500,12500],'年龄':[25,30,28,32,35,27,29,31],'入职日期':pd.date_range('2024-01-01',periods=8,freq='M')})print("原始数据:")print(df)

2. 按值排序

2.1 sort_values() 基础

# 按单列升序(默认)print("按工资升序:")print(df.sort_values('工资'))# 按单列降序print("\n按工资降序:")print(df.sort_values('工资',ascending=False))

2.2 按多列排序

# 先按部门升序,再按工资降序print("按部门升序、工资降序:")print(df.sort_values(['部门','工资'],ascending=[True,False]))# 多列排序示例print("\n按部门升序、年龄降序:")print(df.sort_values(['部门','年龄'],ascending=[True,False]))

2.3 处理缺失值

# 创建包含缺失值的数据df_na=df.copy()df_na.loc[2,'工资']=np.nan df_na.loc[5,'年龄']=np.nanprint("包含缺失值的数据:")print(df_na)# na_position 控制缺失值位置print("\n缺失值放在最后:")print(df_na.sort_values('工资',na_position='last'))print("\n缺失值放在最前:")print(df_na.sort_values('工资',na_position='first'))

3. 按索引排序

3.1 sort_index() 基础

# 创建乱序数据np.random.seed(42)df_shuffled=df.sample(frac=1)print("乱序数据:")print(df_shuffled)# 按行索引排序print("\n按行索引排序:")print(df_shuffled.sort_index())# 按行索引降序print("\n按行索引降序:")print(df_shuffled.sort_index(ascending=False))

3.2 按列索引排序

# 按列索引排序(axis=1)print("按列索引排序:")print(df.sort_index(axis=1))# 按列索引降序print("\n按列索引降序:")print(df.sort_index(axis=1,ascending=False))

4. 排序的高级应用

4.1 获取前 N 行

# 工资最高的3人print("工资最高的3人:")print(df.nlargest(3,'工资')[['姓名','工资']])# 工资最低的2人print("\n工资最低的2人:")print(df.nsmallest(2,'工资')[['姓名','工资']])# 按多列取最大print("\n年龄最大且工资最高的:")# 先按年龄排序,再取前3print(df.sort_values(['年龄','工资'],ascending=[False,False]).head(3))

4.2 分组内排序

# 每个部门内按工资排序print("各部门内按工资排序:")print(df.sort_values(['部门','工资'],ascending=[True,False]))# 使用 groupby 后排序df_sorted=df.sort_values(['部门','工资'],ascending=[True,False])print("\n各部门工资排名:")print(df_sorted)

4.3 排序后重置索引

# 排序后重置索引print("排序后重置索引:")df_sorted=df.sort_values('工资',ascending=False).reset_index(drop=True)print(df_sorted)# 保留原索引print("\n排序后保留原索引:")df_sorted_with_index=df.sort_values('工资',ascending=False).reset_index()print(df_sorted_with_index)

5. 完整示例:销售数据分析

# 创建销售数据np.random.seed(42)sales=pd.DataFrame({'日期':pd.date_range('2024-01-01',periods=30,freq='D'),'产品':np.random.choice(['产品A','产品B','产品C'],30),'销售额':np.random.randint(1000,5000,30),'数量':np.random.randint(10,100,30),'地区':np.random.choice(['华东','华南','华北','西南'],30)})print("="*60)print("销售数据分析")print("="*60)print("\n原始数据:")print(sales.head(10))# 1. 按销售额排序(查看最高销售额)print("\n1. 销售额前5名:")print(sales.nlargest(5,'销售额')[['日期','产品','销售额']])# 2. 按日期排序print("\n2. 按日期排序:")print(sales.sort_values('日期').head(10)[['日期','销售额']])# 3. 按产品和销售额排序print("\n3. 按产品和销售额排序:")print(sales.sort_values(['产品','销售额'],ascending=[True,False]).head(10))# 4. 各地区销售额排名print("\n4. 各地区销售额排名(华东地区):")east_sales=sales[sales['地区']=='华东'].sort_values('销售额',ascending=False)print(east_sales[['日期','产品','销售额']])# 5. 按销售额排序后计算累计占比print("\n5. 销售额累计占比分析:")sales_sorted=sales.sort_values('销售额',ascending=False).reset_index(drop=True)sales_sorted['累计销售额']=sales_sorted['销售额'].cumsum()sales_sorted['累计占比']=(sales_sorted['累计销售额']/sales_sorted['销售额'].sum()*100).round(2)print(sales_sorted[['销售额','累计销售额','累计占比']].head(10))

6. 排序性能优化

# 大数据集排序large_df=pd.DataFrame({'A':np.random.randint(0,100,100000),'B':np.random.randn(100000)})importtime# 单列排序start=time.time()large_df.sort_values('A',inplace=True)print(f"单列排序耗时:{time.time()-start:.4f}秒")# 多列排序start=time.time()large_df.sort_values(['A','B'],inplace=True)print(f"多列排序耗时:{time.time()-start:.4f}秒")

7. 总结

方法用途示例
sort_values('col')按列升序排序df.sort_values('工资')
sort_values('col', ascending=False)按列降序排序df.sort_values('工资', ascending=False)
sort_values(['col1','col2'])按多列排序df.sort_values(['部门','工资'])
sort_values(na_position='first')缺失值位置df.sort_values('col', na_position='first')
nlargest(n, 'col')前 n 个最大值df.nlargest(3, '工资')
nsmallest(n, 'col')前 n 个最小值df.nsmallest(3, '工资')
sort_index()按索引排序df.sort_index()
reset_index(drop=True)重置索引df.sort_values('col').reset_index(drop=True)

http://www.jsqmd.com/news/825031/

相关文章:

  • 3分钟搞定B站视频下载:免费解锁大会员4K高清内容,永久收藏你的学习资料库
  • 网盘直链解析:五分钟告别限速困扰的终极指南
  • Python数据分析实战:线性回归与关联规则挖掘的完整工作流
  • 作业集1~3总结
  • 【Oracle数据库指南】第49篇:Oracle数据库安全加固与最佳实践
  • 如何快速搭建FOC轮腿机器人:面向创客的完整开源DIY指南
  • AI 对编程范式的颠覆:从逻辑指令到意图交付
  • 链路追踪与分布式追踪:构建可观测的微服务系统
  • 超越标准AI基准:构建与应用替代性评估体系
  • 从DDPG到MADDPG:为什么你的多智能体项目总训不好?可能是这几点没搞懂
  • 2026年5月更新:ED堵头定制技术迭代,如何选择核心供应商? - 2026年企业推荐榜
  • DeepSeek模型部署必过关卡:KISS检查清单(含7个致命反模式+3个自动化校验脚本)
  • mysql如何快速定位导致锁表的SQL语句_监控与排查技巧
  • 终极No Man‘s Sky存档编辑器:NomNom完整指南与5大核心优势
  • 小微团队如何利用Taotoken统一管理多项目AI调用与成本
  • React智能体开发框架:基于Hooks的AI应用构建实践
  • AdaBox订阅服务全指南:从注册到管理的完整流程与价值解析
  • 【Adobe Labs内部流出】Sora 2-Premiere双向桥接协议详解:支持帧级语义锚点与LUT链式继承
  • 后天,苏州工业园图书馆,不见不散~
  • 基于ESP32与3D打印技术打造48km/h开源智能遥控赛车
  • AI智能体开发实战:基于claw-kits构建模块化工具调用系统
  • 技术债不是坏事,坏的是你不知道自己欠了多少
  • LaTeX-PPT:如何在3分钟内让PowerPoint拥有专业数学公式排版能力
  • 从“九三架构”看人机耦合频率、相变与态势感知谱系
  • 明日方舟游戏素材资源库:免费获取8000+官方美术资源的终极指南
  • 海能达与摩托罗拉7.6亿美元诉讼案:专网通信知识产权攻防启示录
  • 别再死记硬背公式了!用Python+NumPy手搓一个卡尔曼滤波器,从传感器数据里‘猜’出真实轨迹
  • 基于PaddleOCR的智能发票识别系统:从OCR到结构化数据提取
  • 如何免费解锁AI编程助手?3步终极解决方案
  • Python工程师必看的Gemini辅助编程手册(2024最新版·仅限首批内测开发者获取)