You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据另一Series的元素顺序重排Series并获取重排后的索引?

按指定Series顺序重排另一个Series并获取索引

嘿,这个需求很常见,我来给你两种实用的解决办法,完美匹配你要按foo的元素顺序重排bar,同时获取重排后bar索引的需求!

先明确我们的基础数据:

import pandas as pd
foo = pd.Series(['d','b','c','a'])
bar = pd.Series(['c','a','b','d'])

方法一:用分类数据类型自定义排序规则

pandas的分类(Categorical)类型可以让我们指定自定义的排序优先级,正好用来匹配foo的顺序:

# 把foo的元素设置为分类的排序基准
bar_categorized = pd.Categorical(bar, categories=foo.values, ordered=True)
# 根据分类顺序获取排序后的索引位置,再提取对应的bar数据
sorted_bar = bar.loc[bar_categorized.argsort()]
# 提取重排后的索引列表
sorted_index = sorted_bar.index.tolist()

# 输出结果
print("重排后的bar:")
print(sorted_bar)
print("\n重排后的索引:")
print(sorted_index)

运行后会得到:

重排后的bar:
3    d
2    b
0    c
1    a
dtype: object

重排后的索引:
[3, 2, 0, 1]

这种方法的优势是支持重复元素,如果你的Series里有重复值,它会把相同值的元素按分类顺序集中排列,非常灵活。


方法二:通过值-索引映射直接匹配顺序

如果你的两个Series里的元素都是唯一不重复的(就像示例里这样),可以用更直观的映射方式:

# 建立bar的“值→索引”映射字典
value_index_map = bar.reset_index().set_index(0)['index'].to_dict()
# 按foo的元素顺序,逐个取出对应的索引
sorted_index = [value_index_map[val] for val in foo.values]
# 根据索引重排bar
sorted_bar = bar.loc[sorted_index]

# 输出结果
print("重排后的bar:")
print(sorted_bar)
print("\n重排后的索引:")
print(sorted_index)

这个方法的输出和第一种完全一致,代码更简洁直观,适合元素唯一的场景。


内容的提问来源于stack exchange,提问作者Johannes Wiesner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:24:43