0

0

基于NumPy索引实现Pandas DataFrame列序关联排序的专业指南

心靈之曲

心靈之曲

发布时间:2025-12-08 17:47:02

|

627人浏览过

|

来源于php中文网

原创

基于numpy索引实现pandas dataframe列序关联排序的专业指南

本教程详细阐述了如何利用NumPy的`argsort`函数,实现一个Pandas DataFrame根据另一个DataFrame的列序进行关联排序。通过将第二个DataFrame转换为NumPy数组并获取其列排序索引,然后利用NumPy高级索引技术,高效地重新排列第一个DataFrame的列,确保两个DataFrame之间保持逻辑一致的列顺序。

引言:关联DataFrame列序排序的需求

在数据分析和处理中,我们经常会遇到需要根据一个数据集的某种度量标准,来重新排列另一个相关数据集的情况。例如,当我们有两个结构相同的Pandas DataFrame,一个存储实体(如单词),另一个存储这些实体对应的某种评分(如相似度分数)。此时,我们可能希望根据评分DataFrame中每行的分数高低,来同步调整实体DataFrame中对应行的列顺序,以保持数据的一致性和可读性。本文将深入探讨如何利用Pandas和NumPy的强大功能,高效且专业地解决这一问题。

场景描述与数据准备

假设我们有两个具有相同索引和列数的Pandas DataFrame:

  1. df1 (实体DataFrame): 包含需要被排序的实体数据(例如,相关的单词)。
  2. df2 (评分DataFrame): 包含用于排序的数值评分,其结构与df1完全对应。

我们的目标是根据df2中每行(即每个索引项)的评分进行列向(axis=1)排序,并将这个排序结果应用到df1上,使得df1的列顺序与df2排序后的列顺序保持一致。

以下是示例数据:

import pandas as pd
import numpy as np

# DataFrame #1 (实体数据,例如单词)
data_words = {
    'Col 0': ['Rockets', 'Canvases', 'Infections'],
    'Col 1': ['Cars', 'Paint', 'Dirt'],
    'Col 2': ['Ships', 'Ink', 'Dust']
}
df1 = pd.DataFrame(data_words, index=['Trains', 'Paintings', 'Germs'])

print("原始 df1 (实体数据):")
print(df1)
# 输出:
#                 Col 0    Col 1  Col 2
# Trains        Rockets     Cars  Ships
# Paintings    Canvases    Paint    Ink
# Germs      Infections     Dirt   Dust

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

print("\n原始 df2 (相似度评分):")
print(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]降序排列后,其原始索引顺序是[1, 0, 2](即80在Col 1,47在Col 0,33在Col 2)。因此,df1中Trains行对应的['Rockets', 'Cars', 'Ships']也应按此顺序变为['Cars', 'Rockets', 'Ships']。

核心原理:numpy.argsort与高级索引

解决此问题的关键在于利用NumPy的两个强大特性:

Trickle AI
Trickle AI

多功能零代码AI应用开发平台

下载
  1. numpy.argsort(): 此函数返回对数组进行排序的索引。例如,np.array([3, 1, 2]).argsort()会返回[1, 2, 0],表示原数组中索引为1的元素最小,其次是索引为2的元素,最后是索引为0的元素。对于二维数组,argsort(axis=1)会按行返回每行元素的排序索引。
  2. NumPy高级索引: NumPy允许使用数组作为索引来访问和重排另一个数组的元素。通过结合行索引数组和列索引数组,我们可以实现复杂的元素选择和重排。

实现步骤与代码示例

我们将通过以下步骤实现关联排序:

  1. 获取排序索引: 对df2进行列向排序(通常是降序),并获取其排序后的列索引。
  2. 应用索引重排df1: 使用获取到的排序索引,结合NumPy的高级索引功能,重新排列df1的列。
# 步骤1: 获取 df2 的列向排序索引
# 为了实现降序排序,我们对 -df2 进行 argsort。
# np.argsort 默认沿最后一个轴(对于二维数组是列)进行排序,返回排序后的元素在原始数组中的索引。
# np.argsort(-df2) 会返回一个与 df2 形状相同的二维数组,其中每个元素是该行排序后的列索引。
sort_indices = np.argsort(-df2.to_numpy(), axis=1)

print("\ndf2 降序排序后的列索引 (每行):")
print(sort_indices)
# 输出示例:
# [[1 0 2]  # Trains行: Col 1(80) > Col 0(47) > Col 2(33)
#  [1 2 0]  # Paintings行: Col 1(90) > Col 2(30) > Col 0(22)
#  [0 2 1]] # Germs行: Col 0(77) > Col 2(52) > Col 1(40)

# 步骤2: 应用索引重排 df1
# 首先将 df1 转换为 NumPy 数组
df1_np = df1.to_numpy()

# 构建行索引数组。np.arange(len(df1)) 生成 [0, 1, 2, ...]
# [:, None] 将其转换为列向量 [[0], [1], [2], ...]
# 这使得在高级索引时,每行都能独立地使用 sort_indices 中的对应行。
row_indices = np.arange(len(df1))[:, None]

# 使用高级索引进行重排
# df1_np[row_indices, sort_indices] 会根据 row_indices 和 sort_indices
# 逐行选择 df1_np 中的元素,从而实现列的重排。
# 最后,将重排后的 NumPy 数组赋值回 df1,使用 df1[:] 确保原地修改。
df1[:] = df1_np[row_indices, sort_indices]

print("\n排序后的 df1 (实体数据):")
print(df1)
# 期望输出:
#                 Col 0    Col 1     Col 2
# Trains           Cars  Rockets     Ships
# Paintings       Paint      Ink  Canvases
# Germs      Infections     Dust      Dirt

代码解析

  1. sort_indices = np.argsort(-df2.to_numpy(), axis=1)

    • df2.to_numpy(): 将Pandas DataFrame df2转换为底层的NumPy数组。这是因为np.argsort直接作用于NumPy数组更高效和直观。
    • -df2.to_numpy(): 为了实现降序排序,我们对所有数值取负。argsort默认是升序,对负数进行升序排序,其结果相当于对原正数进行降序排序。
    • axis=1: 指定排序操作沿行方向进行,即对每一行的列进行排序。这将返回一个二维数组,其中每个元素是该行中排序后元素在原行中的列索引。
    • sort_indices: 存储了一个二维数组,其形状与df2相同,内容是每一行中元素按降序排列后的原始列索引。
  2. row_indices = np.arange(len(df1))[:, None]

    • len(df1): 获取df1的行数。
    • np.arange(len(df1)): 生成一个从0到len(df1)-1的一维整数数组,表示df1的行索引。
    • [:, None]: 这是NumPy的一个技巧,用于增加数组的维度。它将一维数组[0, 1, 2]转换为一个列向量[[0], [1], [2]]。这个列向量在高级索引中至关重要,它确保了sort_indices中的每一行(代表一个原始行)都能独立地应用于df1_np的相应行。
  3. df1[:] = df1_np[row_indices, sort_indices]

    • df1_np = df1.to_numpy(): 再次将df1转换为NumPy数组,因为NumPy的高级索引操作直接作用于NumPy数组更高效。
    • df1_np[row_indices, sort_indices]: 这是NumPy的高级索引核心。
      • row_indices ([[0], [1], [2]]) 广播到 sort_indices 的所有列。
      • 这有效地告诉NumPy:“对于第0行,使用sort_indices的第0行作为列索引来重排df1_np的第0行;对于第1行,使用sort_indices的第1行作为列索引来重排df1_np的第1行,依此类推。”
      • 结果是一个新的NumPy数组,其列已根据df2的排序规则进行了重排。
    • df1[:] = ...: 将重排后的NumPy数组赋值回df1。使用[:]进行赋值是Pandas中一种常见的原地修改DataFrame底层数据的方式,它会保留DataFrame原有的索引和列名,只更新其值。

注意事项

  • 维度一致性: 确保df1和df2具有完全相同的行数和列数。如果维度不匹配,np.argsort或高级索引操作可能会报错或产生意外结果。
  • 排序方向:
    • 要实现降序排序,需要对评分DataFrame取负数(例如,-df2)后再进行argsort。
    • 要实现升序排序,直接对评分DataFrame进行argsort即可(例如,np.argsort(df2.to_numpy(), axis=1))。
  • 性能: 这种方法通过将DataFrame转换为NumPy数组,并利用NumPy优化的数组操作,在处理大型数据集时通常具有非常高的性能。
  • 原地修改与新DataFrame: df1[:] = ... 这种写法会原地修改df1。如果需要保留原始df1并创建一个新的排序后的DataFrame,可以这样操作:df_sorted = df1_np[row_indices, sort_indices],然后将df_sorted转换为新的DataFrame。

总结

本教程提供了一种高效且专业的解决方案,用于根据一个Pandas DataFrame的列序来关联排序另一个DataFrame。通过巧妙地结合numpy.argsort获取排序索引和NumPy的高级索引功能,我们能够实现复杂的逐行列重排逻辑,同时保持代码的简洁性和执行效率。掌握这种技术,将有助于您在数据处理和分析工作中更灵活地处理关联数据集的排序需求。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

54

2025.12.04

数据分析的方法
数据分析的方法

数据分析的方法有:对比分析法,分组分析法,预测分析法,漏斗分析法,AB测试分析法,象限分析法,公式拆解法,可行域分析法,二八分析法,假设性分析法。php中文网为大家带来了数据分析的相关知识、以及相关文章等内容。

470

2023.07.04

数据分析方法有哪几种
数据分析方法有哪几种

数据分析方法有:1、描述性统计分析;2、探索性数据分析;3、假设检验;4、回归分析;5、聚类分析。本专题为大家提供数据分析方法的相关的文章、下载、课程内容,供大家免费下载体验。

280

2023.08.07

网站建设功能有哪些
网站建设功能有哪些

网站建设功能包括信息发布、内容管理、用户管理、搜索引擎优化、网站安全、数据分析、网站推广、响应式设计、社交媒体整合和电子商务等功能。这些功能可以帮助网站管理员创建一个具有吸引力、可用性和商业价值的网站,实现网站的目标。

733

2023.10.16

数据分析网站推荐
数据分析网站推荐

数据分析网站推荐:1、商业数据分析论坛;2、人大经济论坛-计量经济学与统计区;3、中国统计论坛;4、数据挖掘学习交流论坛;5、数据分析论坛;6、网站数据分析;7、数据分析;8、数据挖掘研究院;9、S-PLUS、R统计论坛。想了解更多数据分析的相关内容,可以阅读本专题下面的文章。

512

2024.03.13

Python 数据分析处理
Python 数据分析处理

本专题聚焦 Python 在数据分析领域的应用,系统讲解 Pandas、NumPy 的数据清洗、处理、分析与统计方法,并结合数据可视化、销售分析、科研数据处理等实战案例,帮助学员掌握使用 Python 高效进行数据分析与决策支持的核心技能。

72

2025.09.08

Python 数据分析与可视化
Python 数据分析与可视化

本专题聚焦 Python 在数据分析与可视化领域的核心应用,系统讲解数据清洗、数据统计、Pandas 数据操作、NumPy 数组处理、Matplotlib 与 Seaborn 可视化技巧等内容。通过实战案例(如销售数据分析、用户行为可视化、趋势图与热力图绘制),帮助学习者掌握 从原始数据到可视化报告的完整分析能力。

55

2025.10.14

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号