新闻中心

基于另一DataFrame的列排序对Pandas DataFrame进行排序

2025-12-05
浏览次数:
返回列表

基于另一DataFrame的列排序对Pandas DataFrame进行排序

本文详细介绍了如何利用numpy的高级索引功能,实现一个pandas dataframe根据另一个具有相同维度dataframe的列排序结果进行重新排序。通过结合`numpy.argsort`获取排序索引和numpy的广播索引机制,可以高效地将一个dataframe的列排序顺序应用到另一个dataframe上,这在处理相关联数据集的同步排序场景中非常实用。

在数据分析和处理中,我们经常会遇到需要对多个关联数据集进行同步操作的场景。一个常见的需求是,当一个数据集(例如,相似度分数)的列需要按特定顺序排序时,另一个与之关联的数据集(例如,对应的词语)也需要按照相同的列排序规则进行调整。本文将详细讲解如何使用Pandas和NumPy来实现这一高级列排序功能。

场景描述

假设我们有两个Pandas DataFrame,它们具有相同的行索引和列数。第一个DataFrame (df1) 包含一组词语,而第二个DataFrame (df2) 包含这些词语对应的相似度分数。我们的目标是根据df2中每行的相似度分数进行列排序(例如,从高到低),然后将df1中的词语也按照df2的排序结果进行同步调整。

示例数据:

首先,我们创建两个示例DataFrame来模拟上述场景。

import pandas as pd
import numpy as np

# DataFrame #1 (词语)
data1 = {
    'Col 0': ['Rockets', 'Canvases', 'Infections'],
    'Col 1': ['Cars', 'Paint', 'Dirt'],
    'Col 2': ['Ships', 'Ink', 'Dust']
}
df1 = pd.DataFrame(data1, index=['Trains', 'Paintings', 'Germs'])

# DataFrame #2 (相似度分数)
data2 = {
    'Col 0': [47, 22, 77],
    'Col 1': [80, 90, 40],
    'Col 2': [33, 30, 52]
}
df2 = pd.DataFrame(data2, index=['Trains', 'Paintings', 'Germs'])

print("原始 df1 (词语):")
print(df1)
print("\n原始 df2 (相似度分数):")
print(df2)

输出的DataFrame如下:

原始 df1 (词语):
           Col 0     Col 1  Col 2
Trains   Rockets      Cars  Ships
Paintings  Canvases     Paint    Ink
Germs   Infections     Dirt   Dust

原始 df2 (相似度分数):
           Col 0  Col 1  Col 2
Trains        47     80     33
Paintings     22     90     30
Germs         77     40     52

我们希望df1的列能够根据df2中每行对应分数的降序进行排序。例如,对于'Trains'这一行,df2的分数是[47, 80, 33],降序排序后对应的原始列索引顺序应该是[Col 1, Col 0, Col 2]。那么df1的'Trains'行也应该变为['Cars', 'Rockets', 'Ships']。

解决方案:利用 numpy.argsort 进行高级索引

解决这个问题的关键在于使用NumPy的argsort函数来获取排序后的索引,然后利用NumPy的广播索引机制将这些索引应用到目标DataFrame上。

网趣购物系统加强升级版 网趣购物系统加强升级版

新版本程序更新主要体现在:完美整合BBS论坛程序,用户只须注册一个帐号,即可全站通用!采用目前流行的Flash滚动切换广告 变换形式多样,受人喜爱!在原有提供的5种在线支付基础上增加北京云网支付!对留言本重新进行编排,加入留言验证码,后台有留言审核开关对购物系统的前台进行了一处安全更新。在原有文字友情链接基础上,增加LOGO友情链接功能强大的6种在线支付方式可选,自由切换。对新闻列表进行了调整,

网趣购物系统加强升级版 0 查看详情 网趣购物系统加强升级版

numpy.argsort函数返回的是一个数组的排序索引,而不是排序后的值。当应用于二维数组时,它可以按行或按列返回排序索引。在这里,我们需要对df2的每一行进行列排序,因此argsort将返回一个与df2形状相同的索引数组,其中每个元素指示对应行中该位置的原始列索引。

为了实现降序排序,我们不能直接对df2使用argsort,因为argsort默认是升序。一个常用的技巧是对df2取负值 (-df2),然后对其进行升序排序,这等效于对原始df2进行降序排序。

具体步骤:

  1. 获取排序索引: 对df2取负值后,使用numpy.argsort获取列方向的排序索引。
  2. 准备行索引: 创建一个表示行索引的NumPy数组,以便在进行NumPy高级索引时能够正确地广播到所有行。
  3. 应用索引: 将获取到的排序索引和行索引结合起来,应用到df1的NumPy数组表示上。
  4. 更新DataFrame: 将排序后的NumPy数组赋值回df1。

代码实现:

# 1. 获取 df2 的降序排序索引
# 对 -df2 进行 argsort,实现降序排序
# .to_numpy() 将 DataFrame 转换为 NumPy 数组,以便使用 NumPy 的 argsort
sort_indices = np.argsort(-df2.to_numpy(), axis=1)

# 2. 准备行索引
# np.arange(len(df1)) 创建 [0, 1, 2, ...]
# [:, None] 将其转换为列向量 [[0], [1], [2], ...]
# 这样在高级索引时,可以与 sort_indices (2D数组) 正确广播,
# 确保每一行都使用其对应的排序索引。
row_indices = np.arange(len(df1))[:, None]

# 3. 应用索引并更新 df1
# df1.to_numpy() 获取 df1 的 NumPy 数组表示
# 使用高级索引 [row_indices, sort_indices]
# 将结果直接赋值给 df1[:],实现原地修改
df1[:] = df1.to_numpy()[row_indices, sort_indices]

print("\n排序后的 df1 (词语):")
print(df1)

输出结果:

排序后的 df1 (词语):
           Col 0    Col 1  Col 2
Trains      Cars  Rockets  Ships
Paintings  Paint   Canvases    Ink
Germs      Infections     Dust   Dirt

代码解析

  • np.argsort(-df2.to_numpy(), axis=1):
    • df2.to_numpy(): 将Pandas DataFrame df2转换为底层的NumPy数组。这是进行高效数值计算和高级索引的首选方式。
    • -df2.to_numpy(): 对所有数值取负,以便后续的argsort(默认升序)能够实现原值的降序排序。
    • np.argsort(..., axis=1): axis=1 表示按行进行排序,并返回每行排序后的元素在原始行中的索引。例如,如果某行是 [47, 80, 33],取负后是 [-47, -80, -33]。argsort会返回 [1, 0, 2],因为 -80 (原Col 1) 最小,其次是 -47 (原Col 0),最后是 -33 (原Col 2)。
  • np.arange(len(df1))[:, None]:
    • len(df1): 获取DataFrame的行数。
    • np.arange(len(df1)): 生成一个从0到行数减1的整数序列,例如 [0, 1, 2]。
    • [:, None]: 这是一个NumPy的切片技巧,用于将一维数组转换为二维列向量。例如,[0, 1, 2] 变为 [[0], [1], [2]]。这样做是为了在高级索引时,NumPy能够正确地将这个行索引广播到sort_indices的每一列,从而为每一行选择正确的元素。
  • df1.to_numpy()[row_indices, sort_indices]:
    • 这是NumPy的高级索引功能。row_indices 提供行索引,sort_indices 提供列索引。
    • 由于row_indices是 (N, 1) 形状,sort_indices 是 (N, M) 形状(N是行数,M是列数),NumPy会进行广播,为df1的每一行选取由sort_indices指定的新列顺序。
  • df1[:] = ...:
    • 将通过高级索引生成的新NumPy数组赋值回df1。使用 df1[:] 而不是 df1 = ... 的优点是,它会修改原始df1对象的内容,而不是创建一个新的DataFrame对象并重新绑定变量。

注意事项

  1. 维度匹配: 此方法要求df1和df2具有完全相同的行数和列数。如果维度不匹配,高级索引会报错。
  2. 数据类型: numpy.argsort适用于数值类型的数据。如果df2包含非数值类型,需要确保其可以被转换为数值类型进行排序。
  3. 原地修改: df1[:] = ... 实现了对df1的原地修改。如果需要保留原始df1并创建一个新的排序DataFrame,可以使用 df1_sorted = pd.DataFrame(df1.to_numpy()[row_indices, sort_indices], index=df1.index, columns=df1.columns)。
  4. 性能: 将DataFrame转换为NumPy数组进行操作通常比直接在Pandas DataFrame上进行迭代或复杂的列操作更高效,尤其对于大型数据集。

总结

通过结合使用numpy.argsort获取排序索引和NumPy的高级广播索引功能,我们可以优雅且高效地解决一个DataFrame根据另一个DataFrame的列排序结果进行同步调整的问题。这种方法不仅功能强大,而且在处理大规模数据时具有出色的性能表现,是Pandas和NumPy在复杂数据操作中协同工作的典型示例。掌握这种技巧,将大大提升你在Python数据处理中的灵活性和效率。

以上就是基于另一DataFrame的列排序对Pandas DataFrame进行排序的详细内容,更多请关注其它相关文章!


# 而不是  # 猕猴桃的网站推广  # 茶具如何营销推广  # 铁岭大型网站建设招聘  # 兰州做网站推广哪个好  # 软件营销推广计划书  # 绵阳网站资讯推广  # 360竞价推广后台网站  # 丹东专业网站建设优势  # 新闻营销推广哪家不错  # 内江网站seo公司  # 数据处理  # python  # 创建一个  # 这是  # 行数  # 升级版  # 购物系统  # 升序  # 降序  # 转换为  # python数据处理  # canva  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  随机参数递归函数的基准调用次数与时间复杂度探究  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  c++ dfs和bfs代码 c++深度广度优先搜索算法  飞书妙记怎样用语音转文字速记_飞书妙记用语音转文字速记【速记方法】  J*aScript中管理异步API调用:确保操作顺序与数据一致性  顺丰快递查单号物流信息 顺丰快递小程序查询入口  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  qq游戏网页版直接玩_qq游戏免下载快速入口  JUnit5/Mockito:优雅测试内部依赖与异常处理的实践  J*aScript中针对特定容器内图片动画的实现教程  AO3网页版最新入口合集 Archive of Our Own在线访问指南  steam官方入口大全 steam账号注册及操作指南  生成rdflib自定义SPARQL函数:参数匹配与实践指南  优化Django表单:提交验证失败后保留用户输入  德邦快递查询平台 德邦快递物流信息查询入口  天眼查企业查询官网入口 天眼查官方网页版查询  126邮箱账号注册 电脑版登录入口  uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  Golang如何通过reflect获取匿名字段方法_Golang reflect匿名字段方法访问技巧  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  Django AJAX 文件上传教程:解决图片无法保存到模型的常见问题  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  Windows10怎么开启存储感知 Windows10系统设置自动清理临时文件释放C盘空间【教程】  yandex入口引擎手机版 yandex安卓版下载入口  高德地图怎么看全景照片_高德地图全景照片浏览教程  J*aScript对象创建方式_J*aScript设计模式应用  DLsite中文平台入口 DLsite官网内容在线查看  谷歌浏览器一键优化方案_谷歌浏览器直达主页极速不卡版  c++ 获取系统当前时间 c++时间戳获取方法  iwriter统一登录平台 iwrite账号密码登录页面  抖音从哪里进入网页版_抖音官方入口链接  汽水音乐网页版使用入口_汽水音乐电脑版播放指南  2026年发布! 美少女养成动作RPG《神剑少女战记》发布实机演示  excel如何生成目录 excel一键生成工作表目录超链接  Python字典中优雅地迭代剩余元素的方法  QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  正确连接J*aScript到HTML实现可点击图片与自定义事件处理  解决Python logging 中 datefmt 导致时间戳固定不变的问题  如何将HTML表格多行数据保存到Google Sheets  一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】  Win10怎么设置静态IP地址 Win10手动配置IP地址步骤【指南】  如何创建没有密码的Windows本地账户_跳过微软账户登录的技巧【教程】  《GTA6》开发画面疑似泄露!这次可不是AI了 

搜索