
本教程详细阐述了如何利用NumPy的`argsort`函数,实现一个Pandas DataFrame根据另一个DataFrame的列序进行关联排序。通过将第二个DataFrame转换为NumPy数组并获取其列排序索引,然后利用NumPy高级索引技术,高效地重新排列第一个DataFrame的列,确保两个DataFrame之间保持逻辑一致的列顺序。
在数据分析和处理中,我们经常会遇到需要根据一个数据集的某种度量标准,来重新排列另一个相关数据集的情况。例如,当我们有两个结构相同的Pandas DataFrame,一个存储实体(如单词),另一个存储这些实体对应的某种评分(如相似度分数)。此时,我们可能希望根据评分DataFrame中每行的分数高低,来同步调整实体DataFrame中对应行的列顺序,以保持数据的一致性和可读性。本文将深入探讨如何利用Pandas和NumPy的强大功能,高效且专业地解决这一问题。
假设我们有两个具有相同索引和列数的Pandas DataFrame:
我们的目标是根据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的两个强大特性:
我们将通过以下步骤实现关联排序:
# 步骤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 Dirtsort_indices = np.argsort(-df2.to_numpy(), axis=1)
row_indices = np.arange(len(df1))[:, None]
df1[:] = df1_np[row_indices, sort_indices]
本教程提供了一种高效且专业的解决方案,用于根据一个Pandas DataFrame的列序来关联排序另一个DataFrame。通过巧妙地结合numpy.argsort获取排序索引和NumPy的高级索引功能,我们能够实现复杂的逐行列重排逻辑,同时保持代码的简洁性和执行效率。掌握这种技术,将有助于您在数据处理和分析工作中更灵活地处理关联数据集的排序需求。
以上就是基于NumPy索引实现Pandas DataFrame列序关联排序的专业指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号