如何根据另一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
相关产品推荐
相关产品推荐

