如何根据MultiIndex的direction层级映射pandas Series中的值?
问题描述
我有一个带MultiIndex的pd.Series,创建代码如下:
import pandas as pd # 创建Series data = { ("long_only", "Security_1"): -1, ("long_only", "Security_3"): 1, ("long_only", "Security_5"): 1, ("short_only", "Security_2"): -1, ("short_only", "Security_4"): 1, ("both", "Security_1"): -2, ("both", "Security_2"): -1, ("both", "Security_4"): 1, } signals = pd.Series(data, dtype="int8") signals.index = signals.index.set_names(["direction", "symbol"]) print(signals)
输出结果:
direction symbol long_only Security_1 -1 Security_3 1 Security_5 1 short_only Security_2 -1 Security_4 1 both Security_1 -2 Security_2 -1 Security_4 1 dtype: int8
需要根据以下字典,结合MultiIndex的direction层级,将Series中的整数值转换为对应字符串:
# 定义映射字典 trade_state_dict = { "long_only": { -1: "long -> flat", 1: "flat -> long", }, "short_only": { -1: "flat -> short", 1: "short -> flat", }, "both": { -2: "long -> short", -1: "long -> flat", 1: "flat -> long", 2: "short -> long", }, }
预期转换结果:
direction symbol long_only Security_1 "long -> flat" Security_3 "flat -> long" Security_5 "flat -> long" short_only Security_2 "flat -> short" Security_4 "short -> flat" both Security_1 "long -> short" Security_2 "long -> flat" Security_4 "flat -> long"
解决方案
方法1:分组映射
通过groupby按direction层级分组,每组调用对应方向的映射字典完成值转换:
result = signals.groupby(level="direction").apply( lambda x: x.map(trade_state_dict[x.name]) )
方法2:多级映射表替换
先将原映射字典转换为带MultiIndex的Series,再直接匹配替换原Series的值:
# 构建多级索引的映射Series mapping = pd.Series({ (dir_type, code): desc for dir_type, inner_map in trade_state_dict.items() for code, desc in inner_map.items() }) # 执行替换 result = signals.replace(mapping)
两种方法均可得到符合预期的转换结果。
内容的提问来源于stack exchange,提问作者Andi
相关产品推荐
相关产品推荐

